用 Delphi 的代码对文件做 MD5

要在网上下载一个文件。文件发布者公布了文件的 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;
发布了116 篇原创文章 · 获赞 19 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/pcplayer/article/details/84669403