经过痛苦的调试会话后,我发现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;
结果是一样的。这是一个错误还是我做错了什么?如果它确实是一个错误,那么最简单的方法就是在不复制我想要散列的流部分的情况下绕过它?
答案 0 :(得分:1)
您是正确的TIdHashSHA1
(具体而言,TIdHashSHA1.NativeGetHashBytes()
方法)忽略了ASize
参数。它从输入流中读取,直到读取的字节数少于64个字符,但需要很长时间。这似乎是一个需要修复的错误。它的阅读量不应超过实际要求。我已经在Indy的bug追踪器中打开了门票。
由于错误与进行数据实际散列的方法相同,因此在我发布官方修补程序之前,您可以执行的唯一解决方法是在NativeGetHashBytes()
中自行修复IdHashSHA.pas
,然后重新编译Indy(或者,如果您不使用运行时包,则可以制作IdHashSHA.pas
的本地副本并将其添加到项目中,然后修复副本。
答案 1 :(得分:1)
现在已经确认它是一个错误,我使用TGpStreamWindow做了一个解决方法。