5,928
社区成员




type
TMD5dig = record
Digest : array[0..3]of LongWord;
function ToString: string;
end;
TAdv32MD5 = record
TotalSize : Int64;
buffDigest : array[0..3]of LongWord;
buffInput : array[0..63]of Byte;
digest : TMD5dig;
constructor Create(const Buffer; Size: LongWord);
procedure Hash(const Buffer; Size: LongWord);
class function MD5(const Buffer; Size: LongWord): TMD5dig; static;
procedure Initialize; stdcall;
procedure Update(const Buffer; Size: LongWord); stdcall;
procedure FinalDigest; stdcall;
end;
const
AdvApi32 = 'AdvApi32.dll';
{ TMD5dig }
function TMD5dig.ToString: string;
const HexChars : array[0..15]of Char = '0123456789ABCDEF';
var
i, b : LongWord;
pSrc : PAnsiChar;
pDst : PChar;
begin
SetLength(Result, 32);
pDst := Pointer(Result);
pSrc := @Self;
for i:=0 to 15 do
begin
b := Ord(pSrc[i]);
pDst[i*2+0] := HexChars[b shr $4];
pDst[i*2+1] := HexChars[b and $f];
end;
end;
{ TAdv32MD5 }
constructor TAdv32MD5.Create(const Buffer; Size: LongWord);
begin
Initialize;
Update(Buffer, Size);
end;
procedure TAdv32MD5.FinalDigest;
external AdvApi32 name 'MD5Final';
procedure TAdv32MD5.Hash(const Buffer; Size: LongWord);
begin
Initialize;
Update(Buffer, Size);
FinalDigest;
end;
procedure TAdv32MD5.Initialize;
external AdvApi32 name 'MD5Init';
class function TAdv32MD5.MD5(const Buffer; Size: LongWord): TMD5dig;
var tmp: TAdv32MD5;
begin
tmp.Hash(Buffer, Size);
Result := tmp.digest;
end;
procedure TAdv32MD5.Update(const Buffer; Size: LongWord);
external AdvApi32 name 'MD5Update';