Delphi: Wie der SHA-Hash einer großen Datei berechnen
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?
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.