在this question中提到了wcrypt2。文件MD5校验和
我需要的仅仅是计算文件的MD5。如果我可以计算它,而不必保存它,因为它是以流格式下载的文件,这将是完美的。
我想有最直接的方法来做到这一点。
谢谢!
在this question中提到了wcrypt2。文件MD5校验和
我需要的仅仅是计算文件的MD5。如果我可以计算它,而不必保存它,因为它是以流格式下载的文件,这将是完美的。
我想有最直接的方法来做到这一点。
谢谢!
这里是印第安纳波利斯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
大多数编程语言都有库可用于计算字符串或字节数组的MD5。在某些语言中,它们甚至是标准库的一部分。我对Delphi并不熟悉,所以我不知道它是否适用于Delphi,但我想说它很可能就是这样。为Delphi搜索哈希和/或加密库。
Indy带有计算几个哈希的函数,MD5就是其中之一。从至少Delphi 2006开始,Indy已经包含在Delphi的所有版本中,并且可以免费下载旧版本的版本。
正如你所提到的,the post you linked to谈论wcrypt2
,这是一个密码程序库,包括MD5。您链接到的帖子似乎也表明它可用于Delphi 7,因为提交者包括标记为“Delphi 7”的输出。你已经标记了这个问题delphi7
,所以我认为这也是你正在使用的版本。那么,什么阻止你使用wcrypt2
?
该问题链接到的副本wcrypt2.pas,该文件中的版权日期似乎表明该设备在Delphi 7发布时已经可用。检查你的安装;你可能已经拥有了它。如果没有,那么该单位也表示它是通过Project Jedi获得的,所以你可以试着在那里寻找单位。
您引用的问题的答案包括示例Delphi代码和Delphi为MD5提供的单元名称。他们与德尔福2009年,所以你应该检查他们是否也可用于您的版本。
在Delphi中查看MD5SUM的this implementation。它需要一个字符串输入,但我想你可以很容易地使它与一个流。
MessageDigest_5也适用于此。
这是在Delphi 7中可用吗?我没有这个版本,所以我给出了答案的不确定性。 – 2009-01-15 22:22:38
@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
基于@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;
要将散列转换为hexstring,您还可以使用:TIdHashMessageDigest5.AsHex(hash); – 2009-01-16 21:07:50
什么:
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;
我在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;
如果使用Overbyte http://www.overbyte.eu/frame_index.html只需添加单元和调用功能FileMD5与文件名
uses OverbyteIcsMd5;
....
function GetMd5File:String;
begin
Result := FileMD5(FileName);
end;
非常类似于此:http://stackoverflow.com/questions/1952929/md5- file-hashing-match-delphi-output-with-php-md5file-function – 2010-01-03 12:06:53