![]() |
Performanceunterschied bei MD5 mit WinAPI
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:
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?
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; 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz