【问题标题】:File MD5 checksum文件 MD5 校验和
【发布时间】:2018-08-31 01:12:48
【问题描述】:

this question 中提到了 wcrypt2。

我需要的是简单地计算一个文件的 MD5。如果我可以计算它而不必保存它,那将是完美的,因为它是流格式的下载文件。

我希望有最直接的方法来做到这一点。

谢谢!

【问题讨论】:

标签: delphi md5 delphi-7


【解决方案1】:

这是 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;

问候, 奥斯卡R1

【讨论】:

  • +1 表示fmOpenRead or fmShareDenyWrite。太多的开发者忘记了这一点。
【解决方案2】:

基于@dummzeuch answere,我编写了这个函数:

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;

【讨论】:

  • 要将哈希转换为十六进制字符串,您还可以使用:TIdHashMessageDigest5.AsHex(hash);
  • IntToHex(Integer(hash[Index]), 4) 将得到错误的字节顺序,The_Fox 建议的替代方法可以正常工作。对于较新版本的 Indy,请使用:result := md5.HashStreamAsHex(s);
  • @Sebastian - HashStreamAsHex 返回一个字符串 - 并且不可能进行类型转换。上面的代码应该如何移植到 Indy 10?
【解决方案3】:

Indy 自带计算多个哈希的函数,MD5 就是其中之一。至少从 Delphi 2006 开始,所有版本的 Delphi 都包含 Indy,并且可以免费下载旧版本。

【讨论】:

    【解决方案4】:

    怎么样:

    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;
    

    【讨论】:

      【解决方案5】:

      正如您所提到的,the post you linked to 谈到了wcrypt2,这是一个加密例程库,包括 MD5。您链接到的帖子似乎也表明它适用于 Delphi 7,因为询问者包含标记为“Delphi 7”的输出。你已经标记了这个问题delphi7,所以我认为这也是你正在使用的版本。那么是什么阻止您使用wcrypt2

      问题链接到 wcrypt2.pas 的副本,该文件中的版权日期似乎表明该单元在 Delphi 7 发布时可用。检查您的安装;你可能已经有了它。如果没有,那么该单元还说它是通过Project Jedi 获得的,因此您也可以尝试在那里寻找该单元。

      您引用的问题的答案包括示例 Delphi 代码和 Delphi 附带的用于执行 MD5 的单元名称。它们与 Delphi 2009 一起提供,因此您应该检查它们是否也适用于您的版本。

      【讨论】:

        【解决方案6】:

        看看德尔福MD5SUM的this implementation。它需要一个字符串作为输入,但我想你可以很容易地让它与流一起工作。

        【讨论】:

          【解决方案7】:

          MessageDigest_5 也适用于此。

          【讨论】:

          • 在 Delphi 7 中可用吗?我没有那个版本,因此我给出的答案不确定。
          • @Rob:MessageDigest_5 自 Delphi 2005 起就可用,但 IdHashMessageDigest.pas 自 Delphi 7 起已包含:wiert.wordpress.com/2009/12/11/…
          【解决方案8】:

          我在带有 Indy 10.1.5 的 Delphi 7 中使用以下函数

          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;
          

          【讨论】:

          • works: strtofile('敏捷的棕狐跳过懒狗'的背', exepath+'foxmd5.txt'); sleep(500) writeln(cc_MD5File(exepath+'foxmd5.txt')); >>> E38CA1D920C4B8B8D3946B2C72F01680
          【解决方案9】:

          如果您使用 Overbyte http://www.overbyte.eu/frame_index.html 只需添加单元并使用文件名调用函数 FileMD5

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

          【讨论】:

            猜你喜欢
            • 2014-06-21
            • 2012-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 1970-01-01
            相关资源
            最近更新 更多