A Hash function returns a 32-bit (or sometimes 64-bit) integers for any given length of data. The function has to be as fast as possible and the collision should be as less as possible.
In Delphi, you can have a Hash function defined as follows, which takes a pointer and a length, and returns a 32-bit unsigned (or signed) integer.
type HashFunction = function(AData: Pointer; ADataLength: Integer): Cardinal;
Hash_djb2
function Hash_djb2(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 5381;
for i := 1 to ADataLength do
begin
Result := ((Result shl 5) + Result) + PByte(AData)^;
AData := Pointer(NativeUInt(AData) + 1);
end;
end;
Hash_djb2a
A Slight variation of Hash_djb2
function Hash_djb2a(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 5381;
for i := 1 to ADataLength do
begin
Result := ((Result shl 5) xor Result) xor PByte(AData)^;
AData := Pointer(NativeUInt(AData) + 1);
end;
end;
Hash_fnv
Hash_fnv(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 2166136261;
for i := 1 to ADataLength do
begin
Result := (Result * 16777619) xor PByte(AData)^;
AData := Pointer(NativeUInt(AData) + 1);
end;
end;
Hash_fnv1a
Slight variation of Hash_fnv.
function Hash_fnv1a(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 2166136261;
for i := 1 to ADataLength do
begin
Result := (Result xor PByte(AData)^) * 16777619;
AData := Pointer(NativeUInt(AData) + 1);
end;
end;
Hash_sdbm
function Hash_sdbm(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 0;
for i := 1 to ADataLength do
begin
Result := PByte(AData)^ + (Result shl 6) + (Result shl 16) - Result;
AData := Pointer(NativeUInt(AData) + 1);
end;
end;
Hash_jenkis
function Hash_jenkis(AData: Pointer; ADataLength: Integer): Cardinal;
var
i: integer;
begin
Result := 0;
for i := 1 to ADataLength do
begin
Inc(Result, PByte(AData)^);
Inc(Result, Result shl 10);
Result := Result xor (Result shr 6);
AData := Pointer(NativeUInt(AData) + 1);
end;
Inc(Result, Result shl 3);
Result := Result xor (Result shr 11);
Inc(Result, Result shl 15);
end;
At D2007, the size of NativeUInt is incorrectly defined as 8 bytes, thus
{$if CompilerVersion <= 18.5}
NativeInt = Integer;
NativeUInt = Cardinal;
{$ifend}
should allow the above 6 hash functions to be compilable under both 32-bit and 64-bit Delphi.
–EOF (The Ultimate Computing & Technology Blog) —
Last Post: C# Randomness Using GUID
Next Post: Does Parallel.For in Delphi Actually Improve the Performance?