FPPS4/rtl/murmurhash.pas

71 lines
1.0 KiB
Plaintext

unit murmurhash;
{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}
interface
Function MurmurHash64A(key:Pointer;len,seed:QWORD):QWORD;
implementation
Function MurmurHash64A(key:Pointer;len,seed:QWORD):QWORD;
const
m:QWORD=QWORD($c6a4a7935bd1e995);
r=47;
var
h,k:QWORD;
data:PQWORD;
_end:PQWORD;
data2:PByte;
begin
h:=seed xor (len*m);
data:=key;
_end:=data+(len shr 3);
while (data<>_end) do
begin
k:=data^;
Inc(data);
k:=k*m;
k:=k xor (k shr r);
k:=k*m;
h:=h xor k;
h:=h*m;
end;
data2:=Pointer(data);
len:=(len and 7);
if (len<>0) then
begin
while (len<>0) do
begin
case len of
7: h:=h xor (QWORD(data2[6]) shl 48);
6: h:=h xor (QWORD(data2[5]) shl 40);
5: h:=h xor (QWORD(data2[4]) shl 32);
4: h:=h xor (QWORD(data2[3]) shl 24);
3: h:=h xor (QWORD(data2[2]) shl 16);
2: h:=h xor (QWORD(data2[1]) shl 8);
1: h:=h xor (QWORD(data2[0]));
end;
Dec(len);
end;
h:=h*m;
end;
h:=h xor (h shr r);
h:=h*m;
h:=h xor (h shr r);
Result:=h;
end;
end.