11

嗨,我需要在 5 Gig 文件上生成 SHA

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

4

5 回答 5

14

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

如果您想知道如何读取缓冲的大文件,请参阅我关于使用自定义缓冲的文件副本的回答。

所以在概念上(没有真正的德尔福代码!):

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;
于 2009-02-16T13:46:03.037 回答
5

我会推荐 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 一起使用过。

于 2009-02-16T15:16:40.010 回答
1

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

于 2009-02-16T18:32:22.693 回答
0

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

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

于 2009-02-16T13:34:57.853 回答
0

@Davy Landman,谢谢,您的回答真的帮了我大忙。这是我最终使用的代码:

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;

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

于 2018-12-29T00:11:02.033 回答