Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Performanceunterschied bei MD5 mit WinAPI (https://www.delphipraxis.net/198951-performanceunterschied-bei-md5-mit-winapi.html)

jus 13. Dez 2018 18:44


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:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz