mirror of https://gitlab.com/basile.b/dexed.git
use fnv1a in fcl-stl
This commit is contained in:
parent
d92390471d
commit
4ea80a8ac4
|
@ -33,15 +33,15 @@ type
|
||||||
|
|
||||||
// function used as string hasher in fcl-stl
|
// function used as string hasher in fcl-stl
|
||||||
TStringHash = class
|
TStringHash = class
|
||||||
class function hash(const key: string; maxBucketsPow2: longint): longint;
|
class function hash(const key: string; maxBucketsPow2: longword): longword;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// HashMap for TValue by string
|
// HashMap for TValue by string
|
||||||
generic TStringHashMap<TValue> = class(specialize THashmap<string, TValue, TStringHash>);
|
generic TStringHashMap<TValue> = class(specialize THashmap<string, TValue, TStringHash>);
|
||||||
|
|
||||||
// function used as objects haser in fcl-stl
|
// function used as object ptr hasher in fcl-stl
|
||||||
TObjectHash = class
|
TObjectHash = class
|
||||||
class function hash(key: TObject; maxBucketsPow2: longint): longint;
|
class function hash(key: TObject; maxBucketsPow2: longword): longword;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// HashSet for any object
|
// HashSet for any object
|
||||||
|
@ -305,30 +305,37 @@ implementation
|
||||||
uses
|
uses
|
||||||
ce_main;
|
ce_main;
|
||||||
|
|
||||||
|
class function TStringHash.hash(const key: string; maxBucketsPow2: longword): longword;
|
||||||
class function TStringHash.hash(const key: string; maxBucketsPow2: longint): longint;
|
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
{$PUSH}{$R-}
|
result := 2166136261;
|
||||||
result := 5381;
|
|
||||||
for i:= 1 to key.length do
|
for i:= 1 to key.length do
|
||||||
begin
|
begin
|
||||||
result := ((result shl 5) + result) + Byte(key[i]);
|
result := result xor Byte(key[i]);
|
||||||
|
result *= 16777619;
|
||||||
end;
|
end;
|
||||||
result := result and (maxBucketsPow2-1);
|
result := result and (maxBucketsPow2-1);
|
||||||
{$POP}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TObjectHash.hash(key: TObject; maxBucketsPow2: longint): longint;
|
class function TObjectHash.hash(key: TObject; maxBucketsPow2: longword): longword;
|
||||||
|
var
|
||||||
|
ptr: PByte;
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
{$PUSH}{$R-}{$WARNINGS OFF}{$HINTS OFF}
|
ptr := PByte(key);
|
||||||
|
result := 2166136261;
|
||||||
{$IFDEF CPU32}
|
{$IFDEF CPU32}
|
||||||
Result := longint(Pointer(key)) and (maxBucketsPow2 -1);
|
for i:= 0 to 3 do
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
Result := longInt(Pointer(key)){ xor PlongInt(PInteger(&key) + 4)^)} and (maxBucketsPow2 -1);
|
for i:= 0 to 7 do
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$POP}
|
begin
|
||||||
|
result := result xor ptr^;
|
||||||
|
result *= 16777619;
|
||||||
|
ptr += 1;
|
||||||
|
end;
|
||||||
|
result := result and (maxBucketsPow2-1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEPersistentShortcut.assign(aValue: TPersistent);
|
procedure TCEPersistentShortcut.assign(aValue: TPersistent);
|
||||||
|
|
Loading…
Reference in New Issue