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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值