Delphi:高效的哈希函數(shù)
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;