【问题标题】:Is TIdHashSHA1.HashStream broken in Delphi 2010?Delphi 2010 中的 TIdHashSHA1.HashStream 是否损坏?
【发布时间】:2013-12-12 02:51:42
【问题描述】:

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

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

【问题讨论】:

    标签: delphi delphi-2010 indy


    【解决方案1】:

    TIdHashSHA1(特别是TIdHashSHA1.NativeGetHashBytes() 方法)忽略了ASize 参数是正确的。它从输入流中读取,直到读取的字节数少于 64,无论这需要多长时间。这似乎是一个需要修复的错误。它的阅读量不应超过实际要求。为此,我已在 Indy 的错误跟踪器中打开票证。

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

    【讨论】:

    • @ThijsvanDien:我已经在 Indy 的 SVN 中签入了对 TIdHashSHA1 的更新。一旦您确认修复工作正常,我将关闭票证。
    • @RemyLebeau 你能提供一个直接链接吗?我正在浏览在线 SVN,但 svn.atozed.com:444/svn/Indy10/trunk/Lib/Protocols/… 最后一次更新是在 2003 年...?
    • @ThijsvanDien:您正在查看 Indy 多年前停止使用的 VCS 系统中的旧提交 cmets。 VCS 将提交 cmets 直接存储在源文件中。 SVN 不这样做。 IdHashSHA.pasIdHashSHA1.pas 今天早些时候都更新了(5071 是当前的修订号)。
    • 刚刚下载了SVN。乍一看,它现在似乎工作正常,但我认为我需要编写一个严肃的单元测试,然后才能信任一个经过大量修改的组件,它是我的应用程序的核心。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2011-06-06
      • 1970-01-01
      • 2011-11-04
      相关资源
      最近更新 更多