4

这个问题中提到了 wcrypt2。

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

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

谢谢!

4

9 回答 9

14

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

于 2010-10-20T11:28:03.990 回答
5

基于@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;
于 2009-01-16T14:39:29.227 回答
3

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

于 2009-01-15T19:42:48.433 回答
2

关于什么:

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;
于 2013-03-27T12:42:58.997 回答
1

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

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

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

于 2009-01-15T19:43:18.307 回答
1

看看这个在 Delphi 中的 MD5SUM 实现。它需要一个字符串作为输入,但我想你可以很容易地让它与流一起工作。

于 2009-01-15T19:48:15.223 回答
1

MessageDigest_5也适用于此。

于 2009-01-15T21:14:00.497 回答
1

我在带有 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;
于 2017-08-26T12:12:22.060 回答
0

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

uses OverbyteIcsMd5;
....
function GetMd5File:String; 
begin
 Result := FileMD5(FileName);
end;
于 2017-08-28T23:29:21.200 回答