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!
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;