Domanda

In questa domanda è citata in wcrypt2.

Ciò di cui ho bisogno è semplicemente calcolare l'MD5 di un file. Sarebbe perfetto se potessi calcolarlo senza doverlo salvare perché è un file scaricato in formato stream.

Vorrei avere il modo più semplice per farlo.

Grazie!

È stato utile?

Soluzione

Ecco un codice funzionante per Indy 10:

function MD5File(const FileName: string): string;
var
  IdMD5: TIdHashMessageDigest5;
  FS: TFileStream;
begin
 IdMD5 := TIdHashMessageDigest5.Create;
 FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 try
   Result := IdMD5.HashStreamAsHex(FS)
 finally
   FS.Free;
   IdMD5.Free;
 end;
end;

Saluti, Oscar1

Altri suggerimenti

Basato su @dummzeuch, ho scritto questa funzione:

function getMD5checksum(s: TStream): string;
 var
  md5: TIdHashMessageDigest5;
  hash : T4x4LongWordRecord;
 begin
  md5 := TIdHashMessageDigest5.Create;
  s.Seek(0,0);
  hash := md5.HashValue(s);
  result := IntToHex(Integer(hash[0]), 4) +
            IntToHex(Integer(hash[1]), 4) +
            IntToHex(Integer(hash[2]), 4) +
            IntToHex(Integer(hash[3]), 4);
 end;

Indy è dotato di funzioni per il calcolo di diversi hash, MD5 è uno di questi. Indy è incluso in tutte le versioni di Delphi almeno da Delphi 2006 e disponibile come download gratuito per le versioni precedenti.

Che dire di:

function GetFileMD5(const Stream: TStream): String; overload;
var MD5: TIdHashMessageDigest5;
begin
    MD5 := TIdHashMessageDigest5.Create;
    try
       Result := MD5.HashStreamAsHex(Stream);
    finally
       MD5.Free;
    end;
end;

function GetFileMD5(const Filename: String): String; overload;
var FileStream: TFileStream;
begin
    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      Result := GetFileMD5(FileStream);
    finally
      FileStream.Free;
    end;
end;

Come hai detto, il post a cui ti sei collegato parla di wcrypt2 , che è una libreria di routine crittografiche, incluso MD5. Il post a cui ti sei collegato sembra anche indicare che è disponibile per Delphi 7 poiché il richiedente include l'output etichettato "Delphi 7." Hai taggato questa domanda delphi7 , quindi presumo sia anche la versione che stai usando. Quindi cosa ti impedisce di usare wcrypt2 ?

La domanda si collega a una copia di wcrypt2.pas e le date di copyright in quel file sembrano indicare che l'unità era disponibile al momento del rilascio di Delphi 7. Controlla la tua installazione; potresti già averlo. In caso contrario, l'unità dice anche che è stata ottenuta tramite Project Jedi , quindi puoi provare a cercare lì anche per l'unità.

Le risposte alla tua domanda di riferimento includono un esempio di codice Delphi e i nomi delle unità fornite con Delphi per eseguire MD5. Vengono con Delphi 2009, quindi dovresti controllare se sono disponibili anche per la tua versione.

Dai un'occhiata a questa implementazione di MD5SUM in Delphi. Richiede una stringa per l'input, ma immagino che tu possa facilmente farlo funzionare con uno stream.

MessageDigest_5 funzionerebbe anche per questo.

Uso la seguente funzione in Delphi 7 con Indy 10.1.5

uses IdHashMessageDigest, idHash, Classes;  

...

function cc_MD5File(const p_fileName : string) : string;
//returns MD5 has for a file
var
  v_idmd5 : TIdHashMessageDigest5;
  v_fs : TFileStream;
  v_hash : T4x4LongWordRecord;
begin
  v_idmd5 := TIdHashMessageDigest5.Create;
  v_fs := TFileStream.Create(p_fileName, fmOpenRead OR fmShareDenyWrite) ;
  try
    v_hash := v_idmd5.HashValue(v_fs);
    result := v_idmd5.AsHex(v_hash);
  finally
    v_fs.Free;
    v_idmd5.Free;
  end;
end;

Se si utilizza Overbyte http://www.overbyte.eu/frame_index.html basta aggiungere l'unità e chiamare la funzione FileMD5 con il nome del file

uses OverbyteIcsMd5;
....
function GetMd5File:String; 
begin
 Result := FileMD5(FileName);
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top