Question

Dans cette question est mentionnée le wcrypt2.

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

J'aimerais avoir le moyen le plus simple de le faire.

Merci!

Était-ce utile?

La solution

Voici un code de travail pour 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;

Cordialement, OscaR1

Autres conseils

D'après @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;

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 est disponible en téléchargement gratuit pour les anciennes versions.

Qu'en est-il de:

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;

Comme vous l'avez mentionné, le message auquel vous êtes lié 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, car le demandeur inclut une sortie intitulée "Delphi 7". Vous avez tagué cette question delphi7 , donc je suppose que c'est également la version que vous utilisez. Alors, qu'est-ce qui vous empêche d'utiliser wcrypt2 ?

La question renvoie à une copie de wcrypt2.pas et les dates de copyright de ce fichier semblent indiquer que l'unité était disponible au moment de la sortie de Delphi 7. Vérifiez votre installation. vous l'avez peut-être déjà. Sinon, l'unité indique également qu'elle a été obtenue via le Project Jedi , ce qui vous permet d'essayer là aussi pour 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 l'exécution de MD5. Ils viennent avec Delphi 2009, vous devez donc vérifier s’ils sont également disponibles pour votre version.

Jetez un coup d’œil à la cette implémentation de MD5SUM dans Delphi. Il faut une chaîne pour la saisie, mais j'imagine que vous pouvez facilement le faire fonctionner avec un flux.

MessageDigest_5 pourrait également fonctionner pour cela.

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;

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

uses OverbyteIcsMd5;
....
function GetMd5File:String; 
begin
 Result := FileMD5(FileName);
end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top