Delphi:高效的哈希函数

控制/MCU

1823人已加入

描述

view plaincopy to clipboardprint?
01.function BKDRHash(buf: Pointer; count: Integer) : Cardinal; assembler;   
02.asm  
03.        PUSH  EBX;   
04.        XOR   EBX, EBX   
05.        MOV   ECX, EAX   
06.        XOR   EAX, EAX   
07.@LOOP:   
08.        TEST  EDX, EDX   
09.        JZ    @EXIT   
10.        MOV   BL,  [ECX]   
11.        IMUL  EAX, 131  
12.        ADD   EAX, EBX   
13.        INC   ECX   
14.        DEC   EDX   
15.        JMP   @LOOP   
16.@EXIT:   
17.        POP   EBX   
18.//----------------------------   
19.// Pascal:   
20.//   
21.//  Result := 0;   
22.//  while count > 0 do   
23.//  begin   
24.//    Result := (Result * 131) + PByte(buf)^;   
25.//    Inc(PByte(buf));   
26.//    Dec(count);   
27.//  end;   
28.end;   
29.function DJBHash(buf: Pointer; count: Integer) : Cardinal; assembler;   
30.asm  
31.        PUSH  EDI   
32.        PUSH  EBX   
33.        XOR   EBX, EBX   
34.        MOV   ECX, EAX   
35.        MOV   EAX, 5381  
36.@LOOP:   
37.        TEST  EDX, EDX   
38.        JZ    @EXIT   
39.        MOV   EDI, EAX   
40.        SHL   EDI, 5  
41.        ADD   EAX, EDI   
42.        MOV   BL, [ECX]   
43.        ADD   EAX, EBX   
44.        INC   ECX   
45.        DEC   EDX   
46.        JMP   @LOOP   
47.@EXIT:   
48.        POP   EBX   
49.        POP   EDI   
50.//----------------------------   
51.// Pascal:   
52.//   
53.//  Result := 5381;   
54.//  while count > 0 do   
55.//  begin   
56.//    Result := ((Result shl 5) + Result) + PByte(buf)^;   
57.//    Inc(PByte(buf));   
58.//    Dec(count);   
59.//  end;   
60.end;  
function BKDRHash(buf: Pointer; count: Integer) : Cardinal; assembler;
asm
        PUSH  EBX;
        XOR   EBX, EBX
        MOV   ECX, EAX
        XOR   EAX, EAX
@LOOP:
        TEST  EDX, EDX
        JZ    @EXIT
        MOV   BL,  [ECX]
        IMUL  EAX, 131
        ADD   EAX, EBX
        INC   ECX
        DEC   EDX
        JMP   @LOOP
@EXIT:
        POP   EBX
//----------------------------
// Pascal:
//
//  Result := 0;
//  while count > 0 do
//  begin
//    Result := (Result * 131) + PByte(buf)^;
//    Inc(PByte(buf));
//    Dec(count);
//  end;
end;
function DJBHash(buf: Pointer; count: Integer) : Cardinal; assembler;
asm
        PUSH  EDI
        PUSH  EBX
        XOR   EBX, EBX
        MOV   ECX, EAX
        MOV   EAX, 5381
@LOOP:
        TEST  EDX, EDX
        JZ    @EXIT
        MOV   EDI, EAX
        SHL   EDI, 5
        ADD   EAX, EDI
        MOV   BL, [ECX]
        ADD   EAX, EBX
        INC   ECX
        DEC   EDX
        JMP   @LOOP
@EXIT:
        POP   EBX
        POP   EDI
//----------------------------
// Pascal:
//
//  Result := 5381;
//  while count > 0 do
//  begin
//    Result := ((Result shl 5) + Result) + PByte(buf)^;
//    Inc(PByte(buf));
//    Dec(count);
//  end;
end; 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分