作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过痛苦的调试 session 后,我发现 TIdHashSHA1.HashStream
不尊重其 ASize
参数。考虑以下代码:
var
Hasher: TIdHashSHA1;
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
Hasher := TIdHashSHA1.Create;
try
MS.LoadFromFile('C:\windows\notepad.exe');
MS.Position := 0;
ShowMessage(Hasher.HashStreamAsHex(MS));
MS.Position := 0;
ShowMessage(Hasher.HashStreamAsHex(MS, 0, MS.Size - 10));
finally
Hasher.Free;
MS.Free;
end;
end;
结果是一样的。这是一个错误还是我做错了什么?如果这确实是一个错误,那么在不复制我想要散列的流部分的情况下绕过它的最简单方法是什么?
最佳答案
您认为 TIdHashSHA1
(具体来说,TIdHashSHA1.NativeGetHashBytes()
方法)忽略 ASize
参数是正确的。它从输入流中读取数据,直到读取的字节数少于 64 个字节,无论这需要多长时间。这似乎确实是一个需要修复的错误。阅读的内容不应超过实际要求的内容。我已经为此在 Indy 的 bug 跟踪器中开了票。
由于该错误与实际进行数据哈希处理的方法相同,因此在我发布官方修复之前,您可以采取的唯一解决方法是在 中自行修复
然后重新编译 Indy(或者,如果您没有使用运行时包,您可以制作 NativeGetHashBytes()
>IdHashSHA.pasIdHashSHA.pas
的本地副本并将其添加到您的项目中,然后修复复制)。
关于delphi - Delphi 2010 中的 TIdHashSHA1.HashStream 是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225940/
我是一名优秀的程序员,十分优秀!