【问题标题】:Delphi: How to calculate the SHA hash of a large fileDelphi:如何计算大文件的 SHA 哈希
【发布时间】:2023-03-14 00:23:01
【问题描述】:

您好,我需要为 5 Gig 文件生成 SHA

你知道可以做到这一点的非基于字符串的 Delphi 库吗?

【问题讨论】:

    标签: delphi sha


    【解决方案1】:

    @戴维兰德曼, 谢谢你,你的回答真的帮助了我。这是我最终使用的代码:

    function HashFileSHA256(const fileName: String): String;
    var
      sha256: TDCP_sha256;
      buffer: array[0..1024*1024] of byte;
      i, bytesRead: Integer;
      streamIn: TFileStream;
      hashBuf: array[0..31] of byte;
    begin
      // Initialization
      Result := '';
      streamIn := TFileStream.Create(fileName, fmOpenRead);
      sha256 := TDCP_sha256.Create(nil);
      for i:=0 to Sizeof(buffer) do
        buffer[i] := 0;
      for i:=0 to Sizeof(hashBuf) do
        hashBuf[i] := 0;
      bytesRead := -1;
    
      // Compute
      try
        sha256.Init;
        while bytesRead <> 0 do
        begin
          bytesRead := streamIn.Read(buffer[0], Sizeof(buffer));
          sha256.Update(buffer[0], bytesRead);
        end;
        sha256.Final(hashBuf);
        for I := 0 to 31 do
          Result := Result + IntToHex(hashBuf[i], 2);
      finally
        streamIn.Free;
        sha256.Free;
      end;
    
      Result := LowerCase(Result);
    end;
    

    P.S.:我是 Pascal 的初学者,所以这段代码很可能很糟糕。但我在 MSYS2 安装程序上对其进行了测试,并且能够验证哈希,这很好。

    【讨论】:

      【解决方案2】:

      如果我没记错的话,Indy 提供了几个基于流的哈希方法。

      【讨论】:

        【解决方案3】:

        我会推荐 Wolfgang Ehrhardt 的 CRC/Hash。
        http://home.netsurf.de/wolfgang.ehrhardt/

        它速度很快,“可以使用最新的 Pascal(TP 5/5.5/6、BP 7、VP 2.1、FPC 1.0/2.0/2.2)和 Delphi 版本(测试 V1 到 V7/9/10) ”。

        我也用过 D11/D12。

        【讨论】:

        • 是的,这也是一个不错的,非常好的 asm 优化 :)
        【解决方案4】:

        您应该使用DCPcrypt v2 并读取缓冲的文件并将缓冲区提供给 SHA 哈希,直到您读取完整的 5GB 文件。

        如果你想知道如何读取缓冲的大文件,请看我的回答about a file copy using custom buffering

        在概念上是这样(没有真正的 delphi 代码!):

        function GetShaHash(const AFilename: String)
        begin
          sha := TSHAHasher.Create;
          SetLength(Result, sha.Size);
          file := OpenFile(AFilename, GENERIC_READ);
          while not eof file do
          begin
             BytesRead := ReadFile(file, buffer[0], 0, 1024 * 1024);
             sha.Update(buffer[0], BytesRead);
          end;
          sha.Final(Result[0]); 
          CloseFile(file);
        end;
        

        【讨论】:

        • 我没有包含真正的 Delphi 代码,因为我目前没有安装 Delphi 编译器。
        • 我也可以推荐HashLib4Pascal!
        【解决方案5】:

        OpenSSL 有一个 Delphi 接口,不是吗?

        这应该会为您提供更好的性能。

        【讨论】:

          猜你喜欢
          • 2010-12-17
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2014-02-03
          • 2012-06-15
          • 1970-01-01
          • 2015-12-18
          • 2011-07-30
          相关资源
          最近更新 更多