几个 GetHashCode 函数:
DBTables.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
function GetHashCode(Str: PChar ): Integer ; var Off, Len, Skip, I: Integer ; begin Result := 0 ; Off := 1 ; Len := StrLen(Str); if Len < 16 then for I := (Len - 1 ) downto 0 do begin Result := (Result * 37 ) + Ord(Str[Off]); Inc(Off); end else begin { Only sample some characters } Skip := Len div 8 ; I := Len - 1 ; while I >= 0 do begin Result := (Result * 39 ) + Ord(Str[Off]); Dec(I, Skip); Inc(Off, Skip); end ; end ; end ; |
Graphics.pas
1
2
3
4
5
6
7
8
9
10
11
12
|
function GetHashCode( const Buffer; Count: Integer ): Word ; assembler; asm MOV ECX,EDX MOV EDX,EAX XOR EAX,EAX @@ 1 : ROL AX, 5 XOR AL,[EDX] INC EDX DEC ECX JNE @@ 1 end ; |
SysUtils.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
function HashName(Name: PChar ): Cardinal ; asm PUSH ESI PUSH EBX MOV ESI, Name XOR EAX, EAX @@loop: ROL EAX, 5 MOV BL, [ESI] CMP BL, 0 JE @@done CMP BL, 'A' JL @@LowerCased CMP BL, 'Z' JG @@LowerCased OR BL, 20H // make lower case @@LowerCased: XOR AL, BL INC ESI JMP @@loop @@done: POP EBX POP ESI RET end ; |
HTTPParse.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function GetHashCode(Ident: PChar ; Length: Integer ): Word ; asm PUSH ESI { $IFNDEF PIC} PUSH EBX XOR EBX,EBX { $ENDIF } MOV ESI, EAX XOR EAX, EAX XOR ECX, ECX @@ 1 : MOV AL,[ESI] ROL CX, 5 XOR CL,CharValue . Byte [EBX + EAX] INC ESI DEC EDX JNE @@ 1 MOV EAX,ECX { $IFNDEF PIC} POP EBX { $ENDIF } POP ESI end ; |