要在网上下载一个文件。文件发布者公布了文件的 MD5. 下载完成后,想校验一下 MD5,看看下载的文件是否正确还是下载出错,需要一个计算文件的 MD5 的工具。
想着 Delphi 应该有现成的计算 MD5 的代码,上网查了一下,有两个方法:
1. 采用 Indy 提供的类;
2. Delphi XEn 之后,官方自带了一套计算 MD5 的库。
如果采用 Indy 的库,需要 uses IdHashMessageDigest, idHash;
如果采用 Delphi 自带的库,需要 uses System.Hash;
于是自己写了一段代码来计算文件的 MD5,发现上述两个方法计算出来的结果一致,也和文件发布者公布的 MD5 一致,证明我下载的文件没错。
但是,发现上述两个方法,速度差异很大。Delphi 自带的库,计算 MD5 的速度,差不多是 Indy 的库计算速度的 10 倍 ,我计算的是时间,耗时有10倍的差异。
以下代码同时采用了两种方法,测试通过:
procedure THeaderFooterForm.Button1Click(Sender: TObject);
var
idmd5 : TIdHashMessageDigest5;
fs : TFileStream;
hash : T4x4LongWordRecord;
fileName: string;
MD5, MD52: string;
T: Cardinal;
HashMD5: THashMD5;
Readed: Integer;
Buffer: PByte;
BufLen: Integer;
begin
//以下计算 MD5 的代码计算结果正确。
//测量结果,Indy 的 TIdHashMessageDigest5 计算 MD5 的速度是 Delphi 自带的 THashMD5 的十倍。也就是采用 THashMD5 更快。
if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName;
end
else Exit;
T := TThread.GetTickCount;
idmd5 := TIdHashMessageDigest5.Create;
fs := TFileStream.Create(fileName, fmOpenRead OR fmShareDenyWrite) ;
try
MD5 := idmd5.HashStreamAsHex(fs); // idmd5.HashStream(fs);
T := TThread.GetTickCount - T;
Memo1.Lines.Add(MD5);
Memo1.Lines.Add(T.ToString);
fs.Position := 0;
T := TThread.GetTickCount;
HashMD5 := THashMD5.Create;
BufLen := 16 * 1024;
Buffer := AllocMem(BufLen);
while fs.Position < fs.Size do
begin
Readed := fs.Read(Buffer^, BufLen);
if Readed > 0 then
begin
HashMD5.update(Buffer^, Readed);
end;
end;
MD52 := HashMD5.HashAsString;
T := TThread.GetTickCount - T;
Memo1.Lines.Add(Uppercase(MD52));
Memo1.Lines.Add(T.ToString);
finally
fs.Free;
idmd5.Free;
end;
end;
今天的文章用 Delphi 的代码对文件做 MD5分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31614.html