AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Performanceunterschied bei MD5 mit WinAPI
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceunterschied bei MD5 mit WinAPI

Ein Thema von jus · begonnen am 13. Dez 2018
Antwort Antwort
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#1

Performanceunterschied bei MD5 mit WinAPI

  Alt 13. Dez 2018, 18: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 21:38 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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