首页 > 解决方案 > 写入后 TFileStream 的 MD5 哈希不正确

问题描述

我正在使用以下方式下载文件TIdHttp,然后使用TIdHashMessageDigest5以下方式检查其 MD5 哈希:

http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;

http.Get(url, fs);
http.Disconnect;

md5Hex := md5.HashStreamAsHex(fs).ToLower;

// expected: 39704b0e2c1d704906d16c42260f45ef
// actual:   d41d8cd98f00b204e9800998ecf8427e

但是,如果我关闭TFileStream并重新打开它,则 MD5 符合预期:

http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;

http.Get(url, fs);
http.Disconnect;

fs.Free;
fs := TFileStream.Create('mydownload.bin', fmOpenRead);

md5Hex := md5.HashStreamAsHex(fs).ToLower;

// expected: 39704b0e2c1d704906d16c42260f45ef
// actual:   39704b0e2c1d704906d16c42260f45ef

为什么会这样?

标签: delphimd5

解决方案


在计算哈希之前,需要将 Filestream 的 Position 设置为零。

代码应如下所示。

http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;

http.Get(url, fs);
http.Disconnect;

fs.Position := 0;
md5Hex := md5.HashStreamAsHex(fs).ToLower;

推荐阅读