1163 lines
33 KiB
ObjectPascal
1163 lines
33 KiB
ObjectPascal
unit XXHASH;
|
|
|
|
interface
|
|
uses Sysutils,Classes,xxhashlib
|
|
{$IFDEF YWRTL} //If you also installed my YWRTL package
|
|
//YWRTL package: https://github.com/YWtheGod/YWRTL
|
|
,YWSTRUTIL //For a faster BinToHex
|
|
,YWTypes //For a no lock buffer allocating
|
|
{$ENDIF} //use a system buildin implement instead will be just fine.
|
|
;
|
|
type
|
|
//XXH3 128bits
|
|
{$ALIGN 16}
|
|
THashXXH3 = record
|
|
private
|
|
state : XXH3_state_t;
|
|
reserve : array[0..31] of byte;
|
|
function _state:PXXH3_state_t; inline;
|
|
procedure Update(const AData: PByte; ALength: NativeInt); overload;
|
|
public
|
|
class operator Assign (var Dest: THashXXH3; const [ref] Src: THashXXH3);
|
|
class function Create: THashXXH3; static;
|
|
class function SeedCreate(Seed:UInt64):THashXXH3; static;
|
|
procedure reset;
|
|
procedure SeedReset(Seed :UInt64);
|
|
procedure Update(const AData; const ALength: NativeInt); overload;
|
|
procedure Update(const AData: TBytes; const ALength: NativeInt = 0);
|
|
overload;
|
|
procedure Update(const Input: string); overload;
|
|
procedure Update(const Input: string; const Encoding : TEncoding); overload;
|
|
|
|
procedure Update(const st: TStream; var size: NativeInt); overload;
|
|
function HashAsBytes : TBytes; overload;
|
|
function HashAsString: string; overload;
|
|
function HashAsUUID : TGuid; overload;
|
|
class function HashAsUUID(const B:Pointer; const L : NativeInt) : TGuid;
|
|
overload; static;
|
|
class function HashAsUUID(const Input : string):TGuid; overload;
|
|
static;
|
|
class function HashAsUUID(const Input : string; const Encoding : TEncoding):
|
|
TGuid; overload; static;
|
|
class function HashAsUUID(const AData: TBytes; const ALen: NativeInt = 0):
|
|
TGuid; overload; static;
|
|
class function HashAsUUID(const st : TStream; var size : NativeInt):TGuid;
|
|
overload; static;
|
|
class function HashAsUUID(const st : TStream):TGuid;
|
|
overload; static;
|
|
class function HashAsBytes(const B:Pointer; const L : NativeInt) : TBytes;
|
|
overload; static;
|
|
class function HashAsBytes(const AData: TBytes; const ALen: NativeInt = 0):
|
|
TBytes; overload; static;
|
|
class function HashAsBytes(const Input: string):TBytes; overload;
|
|
static;
|
|
class function HashAsBytes(const Input: string; const Encoding: TEncoding):
|
|
TBytes; overload; static;
|
|
class function HashAsBytes(const st : TStream; var size : NativeInt):TBytes;
|
|
overload; static;
|
|
class function HashAsBytes(const st : TStream):TBytes;
|
|
overload; static;
|
|
class function HashAsString(const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function HashAsString(const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function HashAsString(const Input: string):string; overload;
|
|
static;
|
|
class function HashAsString(const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function HashAsString(const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function HashAsString(const st: TStream):string;
|
|
overload; static;
|
|
|
|
class function SeedHashAsUUID(const Seed:UInt64; const B:Pointer; const L : NativeInt) : TGuid;
|
|
overload; static;
|
|
class function SeedHashAsUUID(const Seed:UInt64; const Input : string):TGuid; overload;
|
|
static;
|
|
class function SeedHashAsUUID(const Seed:UInt64; const Input : string; const Encoding : TEncoding):
|
|
TGuid; overload; static;
|
|
class function SeedHashAsUUID(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt = 0):
|
|
TGuid; overload; static;
|
|
class function SeedHashAsUUID(const Seed:UInt64; const st : TStream; var size : NativeInt):TGuid;
|
|
overload; static;
|
|
class function SeedHashAsUUID(const Seed:UInt64; const st : TStream):TGuid;
|
|
overload; static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const B:Pointer; const L : NativeInt) : TBytes;
|
|
overload; static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt = 0):
|
|
TBytes; overload; static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const Input: string):TBytes; overload;
|
|
static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const Input: string; const Encoding: TEncoding):
|
|
TBytes; overload; static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const st : TStream; var size : NativeInt):TBytes;
|
|
overload; static;
|
|
class function SeedHashAsBytes(const Seed:UInt64; const st : TStream):TBytes;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const Input: string):string; overload;
|
|
static;
|
|
class function SeedHashAsString(const Seed:UInt64; const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const st: TStream):string;
|
|
overload; static;
|
|
end;
|
|
|
|
//XXH64
|
|
THashXXH64 = record
|
|
private
|
|
state : XXH64_state_t;
|
|
reserve : array[0..31] of byte;
|
|
function _state:PXXH64_state_t; inline;
|
|
procedure Update(const AData: PByte; ALength: NativeInt); overload;
|
|
public
|
|
class operator Assign (var Dest: THashXXH64; const [ref] Src: THashXXH64);
|
|
class function Create: THashXXH64; static;
|
|
class function SeedCreate(Seed:UInt64):THashXXH64; static;
|
|
procedure reset;
|
|
procedure SeedReset(Seed :UInt64);
|
|
procedure Update(const AData; const ALength: NativeInt); overload;
|
|
procedure Update(const AData: TBytes; const ALength: NativeInt = 0);
|
|
overload;
|
|
procedure Update(const Input: string); overload;
|
|
procedure Update(const Input: string; const Encoding : TEncoding); overload;
|
|
|
|
procedure Update(const st: TStream; var size: NativeInt); overload;
|
|
function HashAsString: string; overload;
|
|
function Hash : UInt64; overload;
|
|
class function Hash(const B:Pointer; const L : NativeInt) : UInt64;
|
|
overload; static;
|
|
class function Hash(const Input : string):UInt64; overload;
|
|
static;
|
|
class function Hash(const Input : string; const Encoding : TEncoding):
|
|
UInt64; overload; static;
|
|
class function Hash(const AData: TBytes; const ALen: NativeInt = 0):
|
|
UInt64; overload; static;
|
|
class function Hash(const st : TStream; var size : NativeInt):UInt64;
|
|
overload; static;
|
|
class function Hash(const st : TStream):UInt64;
|
|
overload; static;
|
|
class function HashAsString(const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function HashAsString(const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function HashAsString(const Input: string):string; overload;
|
|
static;
|
|
class function HashAsString(const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function HashAsString(const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function HashAsString(const st: TStream):string;
|
|
overload; static;
|
|
class function SeedHash(const Seed:UInt64; const B:Pointer; const L : NativeInt) : UInt64;
|
|
overload; static;
|
|
class function SeedHash(const Seed:UInt64; const Input : string):UInt64; overload;
|
|
static;
|
|
class function SeedHash(const Seed:UInt64; const Input : string; const Encoding : TEncoding):
|
|
UInt64; overload; static;
|
|
class function SeedHash(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt = 0):
|
|
UInt64; overload; static;
|
|
class function SeedHash(const Seed:UInt64; const st : TStream; var size : NativeInt):UInt64;
|
|
overload; static;
|
|
class function SeedHash(const Seed:UInt64; const st : TStream):UInt64;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const Input: string):string; overload;
|
|
static;
|
|
class function SeedHashAsString(const Seed:UInt64; const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:UInt64; const st: TStream):string;
|
|
overload; static;
|
|
end;
|
|
|
|
//XXH32
|
|
THashXXH32 = record
|
|
private
|
|
state : XXH32_state_t;
|
|
reserve : array[0..31] of byte;
|
|
function _state:PXXH32_state_t; inline;
|
|
procedure Update(const AData: PByte; ALength: NativeInt); overload;
|
|
public
|
|
class operator Assign (var Dest: THashXXH32; const [ref] Src: THashXXH32);
|
|
class function Create: THashXXH32; static;
|
|
class function SeedCreate(Seed:Cardinal):THashXXH32; static;
|
|
procedure reset;
|
|
procedure SeedReset(Seed :Cardinal);
|
|
procedure Update(const AData; const ALength: NativeInt); overload;
|
|
procedure Update(const AData: TBytes; const ALength: NativeInt = 0);
|
|
overload;
|
|
procedure Update(const Input: string); overload;
|
|
procedure Update(const Input: string; const Encoding : TEncoding); overload;
|
|
|
|
procedure Update(const st: TStream; var size: NativeInt); overload;
|
|
function HashAsString: string; overload;
|
|
function Hash : Cardinal; overload;
|
|
class function Hash(const B:Pointer; const L : NativeInt) : Cardinal;
|
|
overload; static;
|
|
class function Hash(const Input : string):Cardinal; overload;
|
|
static;
|
|
class function Hash(const Input : string; const Encoding : TEncoding):
|
|
Cardinal; overload; static;
|
|
class function Hash(const AData: TBytes; const ALen: NativeInt = 0):
|
|
Cardinal; overload; static;
|
|
class function Hash(const st : TStream; var size : NativeInt):Cardinal;
|
|
overload; static;
|
|
class function Hash(const st : TStream):Cardinal;
|
|
overload; static;
|
|
class function HashAsString(const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function HashAsString(const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function HashAsString(const Input: string):string; overload;
|
|
static;
|
|
class function HashAsString(const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function HashAsString(const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function HashAsString(const st: TStream):string;
|
|
overload; static;
|
|
class function SeedHash(const Seed:Cardinal; const B:Pointer; const L : NativeInt) : Cardinal;
|
|
overload; static;
|
|
class function SeedHash(const Seed:Cardinal; const Input : string):Cardinal; overload;
|
|
static;
|
|
class function SeedHash(const Seed:Cardinal; const Input : string; const Encoding : TEncoding):
|
|
Cardinal; overload; static;
|
|
class function SeedHash(const Seed:Cardinal; const AData: TBytes; const ALen: NativeInt = 0):
|
|
Cardinal; overload; static;
|
|
class function SeedHash(const Seed:Cardinal; const st : TStream; var size : NativeInt):Cardinal;
|
|
overload; static;
|
|
class function SeedHash(const Seed:Cardinal; const st : TStream):Cardinal;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const B: Pointer; const L : NativeInt): string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const AData: TBytes; const ALen: NativeInt = 0):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const Input: string):string; overload;
|
|
static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const Input: string; const Encoding: TEncoding):
|
|
string; overload; static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const st: TStream; var size: NativeInt):string;
|
|
overload; static;
|
|
class function SeedHashAsString(const Seed:Cardinal; const st: TStream):string;
|
|
overload; static;
|
|
end;
|
|
|
|
implementation
|
|
{$IFDEF MSWINDOWS}
|
|
uses libc;
|
|
{$ELSE}
|
|
uses Posix.String_;
|
|
{$ENDIF}
|
|
//uses Hash;
|
|
|
|
function Hex128(const t : XXH128_hash_t):string;
|
|
begin
|
|
{$IFDEF YWRTL}
|
|
Result := BinToHex2(@t,sizeof(XXH128_hash_t));
|
|
{$ELSE}
|
|
setlength(Result,sizeof(XXH128_hash_t)*2);
|
|
BinToHex(t,PWideChar(Result),sizeof(XXH128_hash_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function Hex64(const t : XXH64_hash_t):string;
|
|
begin
|
|
{$IFDEF YWRTL}
|
|
Result := BinToHex2(@t,sizeof(XXH64_hash_t));
|
|
{$ELSE}
|
|
setlength(Result,sizeof(XXH64_hash_t)*2);
|
|
BinToHex(t,PWideChar(Result),sizeof(XXH64_hash_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function Hex32(const t : XXH32_hash_t):string;
|
|
begin
|
|
{$IFDEF YWRTL}
|
|
Result := BinToHex2(@t,sizeof(XXH32_hash_t));
|
|
{$ELSE}
|
|
setlength(Result,sizeof(XXH32_hash_t)*2);
|
|
BinToHex(t,PWideChar(Result),sizeof(XXH32_hash_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure GetBuffer(var b : PByte);
|
|
begin
|
|
{$IFDEF YWRTL}
|
|
b := bufferpool128k.GetBuffer;
|
|
{$ELSE}
|
|
Getmem(b,128*1024);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure FreeBuffer(var b : PByte);
|
|
begin
|
|
{$IFDEF YWLIB}
|
|
bufferpool128k.FreeBuffer(b);
|
|
{$ELSE}
|
|
FreeMem(b);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TrueLen(const AData: TBytes; const ALength:NativeInt):NativeInt;
|
|
begin
|
|
Result := Length(AData);
|
|
if (ALength>0)and(ALength<Result) then Result := ALength;
|
|
end;
|
|
|
|
{ THashXXH3 }
|
|
|
|
class operator THashXXH3.Assign(var Dest: THashXXH3; [ref]const Src: THashXXH3);
|
|
begin
|
|
{$IFDEF MSWINDOWS}
|
|
memmove(Dest._state,Src._state,SizeOf(XXH3_state_t));
|
|
{$ELSE}
|
|
memmove(Dest._state^,Src._state^,SizeOf(XXH3_state_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
class function THashXXH3.Create: THashXXH3;
|
|
begin
|
|
Result.reset;
|
|
end;
|
|
|
|
class function THashXXH3.SeedCreate(Seed: UInt64): THashXXH3;
|
|
begin
|
|
Result.SeedReset(Seed);
|
|
end;
|
|
|
|
function THashXXH3.HashAsBytes: TBytes;
|
|
begin
|
|
SetLength(Result,sizeof(XXH128_hash_t));
|
|
PXXH128_hash_t(Result)^ := XXH3_128bits_digest(_state^);
|
|
end;
|
|
|
|
function THashXXH3.HashAsUUID: TGuid;
|
|
begin
|
|
XXH128_hash_t(Result) := XXH3_128bits_digest(_state^);
|
|
end;
|
|
|
|
function THashXXH3.HashAsString: string;
|
|
begin
|
|
Result := Hex128(XXH3_128bits_digest(_state^));
|
|
end;
|
|
|
|
procedure THashXXH3.reset;
|
|
begin
|
|
if XXH3_128bits_reset(_state^)<>XXH_OK then
|
|
raise Exception.Create('XXH3_128bits_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH3.SeedReset(Seed: UInt64);
|
|
begin
|
|
if XXH3_128bits_reset_withSeed(_state^,Seed)<>XXH_OK then
|
|
raise Exception.Create('XXH3_128bits_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const Input: string; const Encoding: TEncoding);
|
|
begin
|
|
Update(Encoding.GetBytes(input));
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const AData: PByte; ALength: NativeInt);
|
|
begin
|
|
if XXH3_128bits_update(_state^,AData,ALength)<>XXH_OK then
|
|
raise Exception.Create('XXH3_128bits_update ERROR!');
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const AData; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(@AData), ALength);
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const st: TStream; var size: NativeInt);
|
|
var b : PByte;
|
|
s,u : integer;
|
|
t : NativeInt;
|
|
begin
|
|
t := 0;
|
|
GetBuffer(b);
|
|
try
|
|
u := 128*1024;
|
|
repeat
|
|
if (size>0)and(size<t+128*1024) then u :=size-t;
|
|
s := st.Read(b^,u);
|
|
Update(b,s);
|
|
inc(t,s);
|
|
until s<128*1024;
|
|
finally
|
|
size := t;
|
|
FreeBuffer(b);
|
|
end;
|
|
end;
|
|
|
|
function THashXXH3._state: PXXH3_state_t;
|
|
begin
|
|
Result := PXXH3_state_t((NativeInt(@self)+31) and NativeInt(-32));
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const AData: TBytes; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(AData), TrueLen(AData,ALength));
|
|
end;
|
|
|
|
procedure THashXXH3.Update(const Input: string);
|
|
begin
|
|
Update(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const B: Pointer; const L: NativeInt):
|
|
TBytes;
|
|
begin
|
|
SetLength(Result,sizeof(XXH128_hash_t));
|
|
PXXH128_hash_t(Result)^ := XXH3_128bits(B,L);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const AData: TBytes; const ALen: NativeInt)
|
|
:TBytes;
|
|
begin
|
|
Result:=HashAsBytes(Pointer(AData),TrueLen(Adata,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex128(XXH3_128bits(B,L))
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const B: Pointer; const L: NativeInt):
|
|
TGuid;
|
|
begin
|
|
XXH128_hash_t(Result) := XXH3_128bits(B,L);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const Input: string): TGuid;
|
|
begin
|
|
Result:=HashAsUUID(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const Input: string;
|
|
const Encoding: TEncoding): TGuid;
|
|
begin
|
|
Result:=HashAsUUID(Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const AData: TBytes; const ALen: NativeInt):
|
|
TGuid;
|
|
begin
|
|
Result:=HashAsUUID(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const Input: string;
|
|
const Encoding: TEncoding): TBytes;
|
|
begin
|
|
Result := HashAsBytes(Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=HashAsString(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const Input: string): string;
|
|
begin
|
|
Result := HashAsString(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := HashAsString(Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const Input: string): TBytes;
|
|
begin
|
|
Result := HashAsBytes(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const st: TStream;
|
|
var size: NativeInt): TGuid;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.HashAsUUID;
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const st: TStream;
|
|
var size: NativeInt): TBytes;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.HashAsBytes;
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed:UInt64; const B: Pointer; const L: NativeInt):
|
|
TBytes;
|
|
begin
|
|
SetLength(Result,sizeof(XXH128_hash_t));
|
|
PXXH128_hash_t(Result)^ := XXH3_128bits_withSeed(B,L,Seed);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt)
|
|
:TBytes;
|
|
begin
|
|
Result:=SeedHashAsBytes(Seed,Pointer(AData),TrueLen(Adata,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed:UInt64; const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex128(XXH3_128bits_withSeed(B,L,Seed))
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed:UInt64; const B: Pointer; const L: NativeInt):
|
|
TGuid;
|
|
begin
|
|
XXH128_hash_t(Result) := XXH3_128bits_withSeed(B,L,Seed);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed:UInt64; const Input: string): TGuid;
|
|
begin
|
|
Result:=SeedHashAsUUID(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed:UInt64; const Input: string;
|
|
const Encoding: TEncoding): TGuid;
|
|
begin
|
|
Result:=SeedHashAsUUID(Seed,Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt):
|
|
TGuid;
|
|
begin
|
|
Result:=SeedHashAsUUID(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed:UInt64; const Input: string;
|
|
const Encoding: TEncoding): TBytes;
|
|
begin
|
|
Result := SeedHashAsBytes(Seed,Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed:UInt64; const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=SeedHashAsString(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed:UInt64; const Input: string): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed:UInt64; const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed:UInt64; const Input: string): TBytes;
|
|
begin
|
|
Result := SeedHashAsBytes(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed:UInt64; const st: TStream;
|
|
var size: NativeInt): TGuid;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.HashAsUUID;
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed:UInt64; const st: TStream;
|
|
var size: NativeInt): TBytes;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.HashAsBytes;
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed:UInt64; const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH3;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
class operator THashXXH64.Assign(var Dest: THashXXH64; [ref]const Src: THashXXH64);
|
|
begin
|
|
{$IFDEF MSWINDOWS}
|
|
memmove(Dest._state,Src._state,SizeOf(XXH64_state_t));
|
|
{$ELSE}
|
|
memmove(Dest._state^,Src._state^,SizeOf(XXH64_state_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
class function THashXXH64.Create: THashXXH64;
|
|
begin
|
|
Result.reset;
|
|
end;
|
|
|
|
class function THashXXH64.SeedCreate(Seed: UInt64): THashXXH64;
|
|
begin
|
|
Result.SeedReset(Seed);
|
|
end;
|
|
|
|
function THashXXH64.Hash: UInt64;
|
|
begin
|
|
XXH64_hash_t(Result) := XXH64_digest(_state^);
|
|
end;
|
|
|
|
function THashXXH64.HashAsString: string;
|
|
begin
|
|
Result := Hex64(XXH64_digest(_state^));
|
|
end;
|
|
|
|
procedure THashXXH64.reset;
|
|
begin
|
|
if XXH64_reset(_state^,0)<>XXH_OK then
|
|
raise Exception.Create('XXH64_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH64.SeedReset(Seed: UInt64);
|
|
begin
|
|
if XXH64_reset(_state^,Seed)<>XXH_OK then
|
|
raise Exception.Create('XXH64_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const Input: string; const Encoding: TEncoding);
|
|
begin
|
|
Update(Encoding.GetBytes(input));
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const AData: PByte; ALength: NativeInt);
|
|
begin
|
|
if XXH64_update(_state^,AData,ALength)<>XXH_OK then
|
|
raise Exception.Create('XXH64_update ERROR!');
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const AData; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(@AData), ALength);
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const st: TStream; var size: NativeInt);
|
|
var b : PByte;
|
|
s,u : integer;
|
|
t : NativeInt;
|
|
begin
|
|
t := 0;
|
|
GetBuffer(b);
|
|
try
|
|
u := 128*1024;
|
|
repeat
|
|
if (size>0)and(size<t+128*1024) then u :=size-t;
|
|
s := st.Read(b^,u);
|
|
Update(b,s);
|
|
inc(t,s);
|
|
until s<128*1024;
|
|
finally
|
|
size := t;
|
|
FreeBuffer(b);
|
|
end;
|
|
end;
|
|
|
|
function THashXXH64._state: PXXH64_state_t;
|
|
begin
|
|
Result := PXXH64_state_t((NativeInt(@self)+31)and NativeInt(-32));
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const AData: TBytes; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(AData), TrueLen(AData,ALength));
|
|
end;
|
|
|
|
procedure THashXXH64.Update(const Input: string);
|
|
begin
|
|
Update(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex64(XXH64(B,L,0))
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const B: Pointer; const L: NativeInt):
|
|
UInt64;
|
|
begin
|
|
XXH64_hash_t(Result) := XXH64(B,L,0);
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const Input: string): UInt64;
|
|
begin
|
|
Result:=Hash(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const Input: string;
|
|
const Encoding: TEncoding): UInt64;
|
|
begin
|
|
Result:=Hash(Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const AData: TBytes; const ALen: NativeInt):
|
|
UInt64;
|
|
begin
|
|
Result:=Hash(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=HashAsString(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const Input: string): string;
|
|
begin
|
|
Result := HashAsString(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := HashAsString(Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const st: TStream;
|
|
var size: NativeInt): UInt64;
|
|
var X : THashXXH64;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.Hash;
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH64;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed:UInt64; const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex64(XXH64(B,L,Seed))
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed:UInt64; const B: Pointer; const L: NativeInt):
|
|
UInt64;
|
|
begin
|
|
XXH64_hash_t(Result) := XXH64(B,L,Seed);
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed:UInt64; const Input: string): UInt64;
|
|
begin
|
|
Result:=SeedHash(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed:UInt64; const Input: string;
|
|
const Encoding: TEncoding): UInt64;
|
|
begin
|
|
Result:=SeedHash(Seed,Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed:UInt64; const AData: TBytes; const ALen: NativeInt):
|
|
UInt64;
|
|
begin
|
|
Result:=SeedHash(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed:UInt64; const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=SeedHashAsString(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed:UInt64; const Input: string): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed:UInt64; const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed:UInt64; const st: TStream;
|
|
var size: NativeInt): UInt64;
|
|
var X : THashXXH64;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.Hash;
|
|
end;
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed:UInt64; const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH64;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
class operator THashXXH32.Assign(var Dest: THashXXH32; [ref]const Src: THashXXH32);
|
|
begin
|
|
{$IFDEF MSWINDOWS}
|
|
memmove(Dest._state,Src._state,sizeof(XXH32_state_t));
|
|
{$ELSE}
|
|
memmove(Dest._state^,Src._state^,sizeof(XXH32_state_t));
|
|
{$ENDIF}
|
|
end;
|
|
|
|
class function THashXXH32.Create: THashXXH32;
|
|
begin
|
|
Result.reset;
|
|
end;
|
|
|
|
class function THashXXH32.SeedCreate(Seed: Cardinal): THashXXH32;
|
|
begin
|
|
Result.SeedReset(Seed);
|
|
end;
|
|
|
|
function THashXXH32.Hash: Cardinal;
|
|
begin
|
|
XXH32_hash_t(Result) := XXH32_digest(_state^);
|
|
end;
|
|
|
|
function THashXXH32.HashAsString: string;
|
|
begin
|
|
Result := Hex32(XXH32_digest(_state^));
|
|
end;
|
|
|
|
procedure THashXXH32.reset;
|
|
begin
|
|
if XXH32_reset(_state^,0)<>XXH_OK then
|
|
raise Exception.Create('XXH32_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH32.SeedReset(Seed: Cardinal);
|
|
begin
|
|
if XXH32_reset(_state^,Seed)<>XXH_OK then
|
|
raise Exception.Create('XXH32_reset Error!');
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const Input: string; const Encoding: TEncoding);
|
|
begin
|
|
Update(Encoding.GetBytes(input));
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const AData: PByte; ALength: NativeInt);
|
|
begin
|
|
if XXH32_update(_state^,AData,ALength)<>XXH_OK then
|
|
raise Exception.Create('XXH32_update ERROR!');
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const AData; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(@AData), ALength);
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const st: TStream; var size: NativeInt);
|
|
var b : PByte;
|
|
s,u : integer;
|
|
t : NativeInt;
|
|
begin
|
|
t := 0;
|
|
GetBuffer(b);
|
|
try
|
|
u := 128*1024;
|
|
repeat
|
|
if (size>0)and(size<t+128*1024) then u :=size-t;
|
|
s := st.Read(b^,u);
|
|
Update(b,s);
|
|
inc(t,s);
|
|
until s<128*1024;
|
|
finally
|
|
size := t;
|
|
FreeBuffer(b);
|
|
end;
|
|
end;
|
|
|
|
function THashXXH32._state: PXXH32_state_t;
|
|
begin
|
|
Result :=PXXH32_state_t((NativeInt(@self)+31)and NativeInt(-32));
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const AData: TBytes; const ALength: NativeInt);
|
|
begin
|
|
Update(PByte(AData), TrueLen(AData,ALength));
|
|
end;
|
|
|
|
procedure THashXXH32.Update(const Input: string);
|
|
begin
|
|
Update(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex32(XXH32(B,L,0))
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const B: Pointer; const L: NativeInt):
|
|
Cardinal;
|
|
begin
|
|
XXH32_hash_t(Result) := XXH32(B,L,0);
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const Input: string): Cardinal;
|
|
begin
|
|
Result:=Hash(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const Input: string;
|
|
const Encoding: TEncoding): Cardinal;
|
|
begin
|
|
Result:=Hash(Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const AData: TBytes; const ALen: NativeInt):
|
|
Cardinal;
|
|
begin
|
|
Result:=Hash(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=HashAsString(Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const Input: string): string;
|
|
begin
|
|
Result := HashAsString(Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := HashAsString(Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const st: TStream;
|
|
var size: NativeInt): Cardinal;
|
|
var X : THashXXH32;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.Hash;
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH32;
|
|
begin
|
|
X.reset;
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed:Cardinal; const B: Pointer; const L: NativeInt):
|
|
string;
|
|
begin
|
|
Result :=Hex32(XXH32(B,L,Seed))
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed:Cardinal; const B: Pointer; const L: NativeInt):
|
|
Cardinal;
|
|
begin
|
|
XXH32_hash_t(Result) := XXH32(B,L,Seed);
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed:Cardinal; const Input: string): Cardinal;
|
|
begin
|
|
Result:=SeedHash(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed:Cardinal; const Input: string;
|
|
const Encoding: TEncoding): Cardinal;
|
|
begin
|
|
Result:=SeedHash(Seed,Encoding.getbytes(Input));
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed:Cardinal; const AData: TBytes; const ALen: NativeInt):
|
|
Cardinal;
|
|
begin
|
|
Result:=SeedHash(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed:Cardinal; const AData: TBytes; const ALen:
|
|
NativeInt): string;
|
|
begin
|
|
Result:=SeedHashAsString(Seed,Pointer(AData),TrueLen(AData,ALen));
|
|
end;
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed:Cardinal; const Input: string): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Input,TEncoding.UTF8);
|
|
end;
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed:Cardinal; const Input: string;
|
|
const Encoding: TEncoding): string;
|
|
begin
|
|
Result := SeedHashAsString(Seed,Encoding.GetBytes(Input));
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed:Cardinal; const st: TStream;
|
|
var size: NativeInt): Cardinal;
|
|
var X : THashXXH32;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.Hash;
|
|
end;
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed:Cardinal; const st: TStream;
|
|
var size: NativeInt): string;
|
|
var X : THashXXH32;
|
|
begin
|
|
X.SeedReset(Seed);
|
|
X.Update(st,size);
|
|
Result := X.HashAsString;
|
|
end;
|
|
|
|
class function THashXXH3.HashAsBytes(const st: TStream): TBytes;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := HashAsBytes(st,s);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsString(const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := HashAsString(st,s);
|
|
end;
|
|
|
|
class function THashXXH3.HashAsUUID(const st: TStream): TGuid;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := HashAsUUID(st,s);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsBytes(const Seed: UInt64;
|
|
const st: TStream): TBytes;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHashAsBytes(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsString(const Seed: UInt64;
|
|
const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHashAsString(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH3.SeedHashAsUUID(const Seed: UInt64;
|
|
const st: TStream): TGuid;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHashAsUUID(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH64.Hash(const st: TStream): UInt64;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := Hash(st,s);
|
|
end;
|
|
|
|
class function THashXXH64.HashAsString(const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := HashAsString(st,s);
|
|
end;
|
|
|
|
class function THashXXH64.SeedHash(const Seed: UInt64;
|
|
const st: TStream): UInt64;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHash(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH64.SeedHashAsString(const Seed: UInt64;
|
|
const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHashAsString(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH32.Hash(const st: TStream): Cardinal;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := Hash(st,s);
|
|
end;
|
|
|
|
class function THashXXH32.HashAsString(const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := HashAsString(st,s);
|
|
end;
|
|
|
|
class function THashXXH32.SeedHash(const Seed: Cardinal;
|
|
const st: TStream): Cardinal;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHash(Seed,st,s);
|
|
end;
|
|
|
|
class function THashXXH32.SeedHashAsString(const Seed: Cardinal;
|
|
const st: TStream): string;
|
|
var s : NativeInt;
|
|
begin
|
|
s := 0;
|
|
Result := SeedHashAsString(Seed,st,s);
|
|
end;
|
|
|
|
end.
|