MD5 хэш TFileStream неверен после записи - PullRequest
1 голос
/ 03 июля 2019

Я загружаю файл, используя TIdHttp, а затем проверяю его MD5-хеш, используя TIdHashMessageDigest5, например:

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

Почему это происходит?

1 Ответ

4 голосов
/ 03 июля 2019

Положение файлового потока должно быть установлено в ноль перед вычислением хэша.

Код должен выглядеть следующим образом.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...