2009-01-15 102 views
4

this question中提到了wcrypt2。文件MD5校验和

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

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

谢谢!

+0

非常类似于此:http://stackoverflow.com/questions/1952929/md5- file-hashing-match-delphi-output-with-php-md5file-function – 2010-01-03 12:06:53

回答

10

这里是印第安纳波利斯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

-3

大多数编程语言都有库可用于计算字符串或字节数组的MD5。在某些语言中,它们甚至是标准库的一部分。我对Delphi并不熟悉,所以我不知道它是否适用于Delphi,但我想说它很可能就是这样。为Delphi搜索哈希和/或加密库。

3

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

1

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

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

您引用的问题的答案包括示例Delphi代码和Delphi为MD5提供的单元名称。他们与德尔福2009年,所以你应该检查他们是否也可用于您的版本。

1

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

1

MessageDigest_5也适用于此。

+0

这是在Delphi 7中可用吗?我没有这个版本,所以我给出了答案的不确定性。 – 2009-01-15 22:22:38

+0

@Rob:自2005年起,MessageDigest_5一直可用,但自Delphi 7以来,IdHashMessageDigest.pas已被包含:http://wiert.wordpress.com/2009/12/11/delphi-md5-the-messagedigest_5-unit- has-been-there-since-delphi-2007/ – 2010-01-03 12:10:09

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

要将散列转换为hexstring,您还可以使用:TIdHashMessageDigest5.AsHex(hash); – 2009-01-16 21:07:50

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

我在Delphi 7中使用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;