2009-01-15 6 views
4

En this question est mentionné le wcrypt2.Fichier checksum MD5

Ce dont j'ai besoin est simplement de calculer le MD5 d'un fichier. Ce serait parfait si je pouvais le calculer sans avoir à le sauvegarder car c'est un fichier téléchargé en format stream.

Je voudrais avoir le moyen le plus simple de le faire.

Merci!

+0

Très similaire à celui-ci: http://stackoverflow.com/questions/1952929/md5- fichier-hashing-match-delphi-output-avec-php-md5file-function –

Répondre

10

Voici un code de travail pour 10 Indy:

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; 

Cordialement, OscaR1

+0

+1 pour 'fmOpenRead ou fmShareDenyWrite'. Trop de développeurs oublient ça. –

-3

La plupart des langages de programmation ont des bibliothèques disponibles pour le calcul du MD5 d'un tableau de chaînes ou d'octets. Dans certaines langues, ils font même partie de la bibliothèque standard. Je ne suis pas du tout familier avec Delphi, donc je ne sais pas si ça existe pour Delphi, mais je dirais que c'est probablement le cas. Recherchez des bibliothèques de hachage et/ou crypto pour Delphi.

3

Indy est livré avec des fonctions permettant de calculer plusieurs hachages, MD5 en fait partie. Indy est inclus dans toutes les versions de Delphi depuis au moins Delphi 2006 et disponible en téléchargement gratuit pour les anciennes versions.

1

Comme vous l'avez mentionné, the post you linked to parle de wcrypt2, qui est une bibliothèque de routines cryptographiques, y compris MD5. Le message que vous avez lié à semble également indiquer qu'il est disponible pour Delphi 7 puisque le demandeur comprend une sortie intitulée "Delphi 7". Vous avez tagué cette question delphi7, donc je suppose que c'est aussi la version que vous utilisez. Alors qu'est-ce qui vous empêche d'utiliser wcrypt2?

La question renvoie vers une copie de wcrypt2.pas, et les dates de copyright dans ce fichier semblent indiquer que l'unité était disponible au moment de la publication de Delphi 7. Vérifiez votre installation vous pourriez déjà l'avoir. Si non, alors l'unité dit aussi qu'il a été obtenu via Project Jedi, donc vous pourriez essayer d'y chercher aussi l'unité.

Les réponses à votre question référencée incluent un exemple de code Delphi et les noms des unités fournies avec Delphi pour faire MD5. Ils viennent avec Delphi 2009, vous devriez donc vérifier s'ils sont également disponibles pour votre version.

1

Jetez un oeil à this implementation de MD5SUM dans Delphi. Cela nécessite une chaîne pour l'entrée, mais j'imagine que vous pouvez facilement le faire fonctionner avec un flux.

1

MessageDigest_5 fonctionnerait aussi pour cela.

+0

Est-ce disponible dans Delphi 7? Je n'ai pas cette version, d'où l'incertitude dans la réponse que j'ai donnée. –

+0

@Rob: MessageDigest_5 est disponible depuis Delphi 2005, mais le IdHashMessageDigest.pas a été inclus depuis Delphi 7: http://wiert.wordpress.com/2009/12/11/delphi-md5-the-messagedigest_5-unit- has-been-there-since-delphi-2007/ –

5

Basé sur answere @dummzeuch j'ai écrit cette fonction:

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; 
+2

Pour convertir le hachage en hexstring, vous pouvez également utiliser: TIdHashMessageDigest5.AsHex (hash); –

+0

IntToHex (Integer (hash [Index]), 4) obtiendra l'ordre des octets faux, l'alternative suggérée par The_Fox fonctionne correctement. Pour les versions plus récentes d'Indy, utilisez: result: = md5.HashStreamAsHex (s); –

+0

@Sebastian - HashStreamAsHex renvoie une chaîne - et un transtypage n'est pas possible. Comment le code ci-dessus doit-il être porté sur Indy 10? – ronaldosantana

2

Qu'en est-:

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

J'utilise la fonction suivante dans Delphi 7 avec 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; 
0

Si vous utilisez Overbyte http://www.overbyte.eu/frame_index.html ajoutez simplement unité et appeler la fonction FileMD5 avec le nom du fichier

uses OverbyteIcsMd5; 
.... 
function GetMd5File:String; 
begin 
Result := FileMD5(FileName); 
end; 
Questions connexes