题
您好我需要在5千兆文件以生成SHA
你知道基于Delphi的库中的非字符串可以做到这一点的?
解决方案
您应该使用 DCPcrypt V2 和阅读您的文件缓存和饲料SHA散列器与缓冲区中,直到您已经阅读完整的5GB文件。
如果你想知道如何读缓存大文件时,看到我的回答约文件复制使用自定义缓冲。
所以在概念(没有真正的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;
其他提示
我会建议沃尔夫冈·埃尔哈特的CRC /散列。点击 http://home.netsurf.de/wolfgang.ehrhardt/
这是快速和“可与大多数当前帕斯卡(TP 5 / 5.5 / 6,BP 7,VP 2.1,FPC 1.0 / 2.0 / 2.2)和Delphi版本(与V1试验到V7 / 9/10)被编译”
我已经与D11 / D12太使用它。
如果正确地记得印带有几个流基于散列方法。
有是一个Delphi接口OpenSSL的,不是吗?
这应该为您提供更好的性能。
@Davy兰德曼 谢谢你,你的答案真的帮了我。这是我结束了使用的代码:
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:我与帕斯卡总初学者,所以这段代码最容易吸收。但是我测试了它的MSYS2安装程序,并得以验证哈希,所以这是很好的。
不隶属于 StackOverflow