您好我需要在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安装程序,并得以验证哈希,所以这是很好的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top