Delphi:两个高效的哈希函数

2011年03月29日 20:15    发布者:1770309616
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,     
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,    
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,  
        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,
        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; 各种哈希函数算法请参考:http://www.partow.net/programming/hashfunctions/

网友评论

eechinaeechin 2011年06月02日
ok :)
eechinaeechin 2011年06月02日
ok :)
eechinaeechin 2011年06月02日
thanks :)