【发布时间】:2023-03-14 00:23:01
【问题描述】:
您好,我需要为 5 Gig 文件生成 SHA
你知道可以做到这一点的非基于字符串的 Delphi 库吗?
【问题讨论】:
您好,我需要为 5 Gig 文件生成 SHA
你知道可以做到这一点的非基于字符串的 Delphi 库吗?
【问题讨论】:
@戴维兰德曼, 谢谢你,你的回答真的帮助了我。这是我最终使用的代码:
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 安装程序上对其进行了测试,并且能够验证哈希,这很好。
【讨论】:
如果我没记错的话,Indy 提供了几个基于流的哈希方法。
【讨论】:
我会推荐 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。
【讨论】:
您应该使用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;
【讨论】:
OpenSSL 有一个 Delphi 接口,不是吗?
这应该会为您提供更好的性能。
【讨论】: