文件MD5校验和

时间:2009-01-15 18:55:27

标签: delphi md5 delphi-7

this question中提到了wcrypt2。

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

我想有最简单的方法来做到这一点。

谢谢!

9 个答案:

答案 0 :(得分:12)

以下是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;

此致 OscaR1

答案 1 :(得分:5)

基于@dummzeuch回答我写了这个函数:

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 :(得分:3)

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

答案 3 :(得分: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;

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

在Delphi中查看MD5SUM的this implementation。它需要一个字符串来输入,但我想你可以很容易地使用它来处理它。

答案 6 :(得分:1)

MessageDigest_5也适用于此。

答案 7 :(得分:0)

我在Delphi 7中使用以下函数和Indy 10.1.5

(node:71620) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: FORBIDDEN
(node:71620) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

答案 8 :(得分:0)

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

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