用 Delphi 的代码对文件做 MD5

用 Delphi 的代码对文件做 MD5要在网上下载一个文件。文件发布者公布了文件的MD5.下载完成后,想校验一下MD5,看看下载的文件是否正确还是下载出错,需要一个计算文件的MD5的工具。想着Delphi应该有现成的计算MD5的代码,上网查了一下,有两个方法:1.采用Indy提供的类;2.DelphiXEn之后,官方自带了一套计算MD5的库。如果采用Indy的库,需要 usesI…

用

要在网上下载一个文件。文件发布者公布了文件的 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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注