Frage

Hallo Ich brauche einen SHA über eine 5-Gig-Datei zu erzeugen

Kennen Sie einen nicht-String basierte Delphi-Bibliothek, die dies tun können?

War es hilfreich?

Lösung

Sie sollten verwenden DCPcrypt v2 und lesen Sie Ihre Datei zwischengespeichert und füttern die SHA Hasher mit dem Puffer, bis Sie die komplette 5GB-Datei gelesen haben.

Wenn Sie wissen wollen, wie eine große Datei gepuffert zu lesen, siehe meine Antwort über kopieren einer Datei mit benutzerdefinierten Puffer .

so in Konzept (kein wirklichen delphi-Code!):

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;

Andere Tipps

Ich würde Wolfgang Ehrhardt CRC / Hash empfehlen.
http://home.netsurf.de/wolfgang.ehrhardt/

Es ist schnell und „kann mit dem meisten aktuellen Pascal (TP 5 / 5,5 / 6, BP 7, VP 2.1, FPC 1.0 / 2.0 / 2.2) und Delphi-Versionen (getestet mit V1 bis V7 / 9/10) zusammengestellt werden, “.

Ich habe es mit D11 / D12 auch verwendet wird.

Wenn ich mich richtig erinnere, Indy kommt mit mehrere einem Strom basierend Hash-Verfahren.

Es gibt eine Delphi-Schnittstelle für OpenSSL, nicht da ist?

Das sollten Sie bessere Leistungen bieten.

@Davy Landman, danke, deine Antwort half mir wirklich heraus. Dies ist der Code, den ich am Ende mit:

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 .: Ich bin ein totaler Anfänger mit Pascal, sodass dieser Code höchstwahrscheinlich saugt. Aber ich getestet es auf dem MSYS2 Installateur und konnte den Hashwert überprüfen, so das ist schön.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top