Registriert seit: 22. Jan 2005
344 Beiträge
Delphi 2007 Professional
|
Performanceunterschied bei MD5 mit WinAPI
13. Dez 2018, 19:44
Hallo,
es scheint 2 Möglichkeiten für die Berechnung eines MD5 Hashes von einer Datei mit der WinApi zu geben.
Delphi-Quellcode:
function StreamToMD5(x: TStream): ArDigest;
const
bufsize = 65536;
var
context: MD5_CTX;
buffer: array[1..bufsize] of byte;
length: integer;
begin
MD5Init(context);
x.Position := 0;
repeat
length := x.Read(buffer, bufsize);
MD5Update(context, @buffer[1], length);
until length <= 0;
MD5Final(context);
result := context.digest;
end;
Delphi-Quellcode:
function MD5_File(infile_name: WideString): ArDigest;
const
bufsize = 65536;
var
infile: THandle;
inbuffer: pointer;
amount_read: DWORD;
cbHashDataLen: DWORD;
Digest: ArDigest;
hProv: TCryptProv;
hHash: TCryptHash;
begin
infile := CreateFileW(PWideChar(infile_name), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if infile = INVALID_HANDLE_VALUE then
begin
ShowMessage('1: ' + SysErrorMessage(GetLastError));
exit;
end;
try
GetMem(inbuffer, bufsize);
hHash := nil;
hProv := 0;
if not CryptAcquireContext(hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then ShowMessage('1: ' + SysErrorMessage(GetLastError));
if not CryptCreateHash(hProv, CALG_MD5, nil, 0, hHash) then ShowMessage('2: ' + SysErrorMessage(GetLastError));
try
ReadFile(infile, inbuffer^, bufsize, amount_read, nil);
repeat
if not CryptHashData(hHash, inbuffer, amount_read, 0) then ShowMessage('3: ' + SysErrorMessage(GetLastError));
ReadFile(infile, inbuffer^, bufsize, amount_read, nil);
until amount_read = 0;
cbHashDataLen := 16;
if not CryptGetHashParam(hHash, HP_HASHVAL, @Digest[0], cbHashDataLen, 0) then ShowMessage('4: ' + SysErrorMessage(GetLastError));
finally
CryptDestroyHash(hhash);
CryptReleaseContext(hprov, 0);
end;
result := Digest;
finally
CloseHandle(infile);
FreeMem(inbuffer);
end;
end;
Doch gibt es einen Performanceunterschied zwischen den beiden Implementierungen? Ich konnte irgendwie keinen feststellen, oder gibt es Nachteile, wenn man den einen oder anderen verwendet?
Weiters habe ich gestern die Geschwindigkeit mit dem MD5File von Erhardt verglichen und konnte bei einer 2,9GB Datei nicht wirklich einen relevanten Geschwindigkeitsunterschied feststellen. Habt dazu Erfahrungen, oder kann man es noch performanter implementieren?
lg,
jus
Geändert von jus (13. Dez 2018 um 22:38 Uhr)
|