Deld 2010中TIdHashSHA1.HashStream是否已损坏?

时间:2013-11-26 19:12:24

标签: delphi delphi-2010 indy

经过痛苦的调试会话后,我发现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;

结果是一样的。这是一个错误还是我做错了什么?如果它确实是一个错误,那么最简单的方法就是在不复制我想要散列的流部分的情况下绕过它?

2 个答案:

答案 0 :(得分:1)

您是正确的TIdHashSHA1(具体而言,TIdHashSHA1.NativeGetHashBytes()方法)忽略了ASize参数。它从输入流中读取,直到读取的字节数少于64个字符,但需要很长时间。这似乎是一个需要修复的错误。它的阅读量不应超过实际要求。我已经在Indy的bug追踪器中打开了门票。

由于错误与进行数据实际散列的方法相同,因此在我发布官方修补程序之前,您可以执行的唯一解决方法是在NativeGetHashBytes()中自行修复IdHashSHA.pas,然后重新编译Indy(或者,如果您不使用运行时包,则可以制作IdHashSHA.pas的本地副本并将其添加到项目中,然后修复副本。

答案 1 :(得分:1)

现在已经确认它是一个错误,我使用TGpStreamWindow做了一个解决方法。