Zitat:
Wenn du über das ganze File hashen willst, dann nimm doch eine vorgefertigte Methode, zum Beispiel
Die Delphi-eigenen Methoden sind elendig langsam. Wenn THashMD5 bei mir 200ms braucht, braucht
DEC für dieselbe Arbeit ~60ms.
Zitat:
Ich hoffe, das hilft. Korrekturen bitte direkt an mich - Dankeschön.
+
Zitat:
Es ist mehr als einmal erwähnt worden, daß der HASH nicht über Chars/Strings/Text gebildet wird, sondern über die in der Datei enthaltenen Bytes.
= *klick*
Delphi-Quellcode:
aByteStream := TBytesStream.Create;
try
aByteStream.LoadFromFile(aFileName);
aByteStream2 := TBytesStream.Create;
try
aByteStream2.Write(aByteStream.Bytes[0], aByteStream.Size); // aktuellen Stream zwischenspeichern
sHash := THashFunctions_Selftest.CalcHash(Trim(TEncoding.ANSI.GetString(aByteStream2.Bytes))); // einen Hash der im neu erzeugten Stream enthaltenen Bytes erzeugen
aByteStream.Size := aByteStream.Size + iHashLengthInBytes; // die Größe des ALTEN streams um maximale Länge des Hashs vergrößern (?)
Move(AnsiString(sHash)[1], aByteStream.Bytes[aByteStream.Size - iHashLengthInBytes], iHashLengthInBytes); // Hash im alten Stream ablegen
aByteStream.SaveToFile(aFileName); // Alten, modifizierten Stream speichern
finally
aByteStream2.Free;
end;
finally
aByteStream.FreeM
end;
// Eine kürzere Variante, ohne aByteStream2 wäre
sHash := THashFunctions_Selftest.CalcHash(Trim(TEncoding.ANSI.GetString(aByteStream.Bytes))); // einen Hash der im Stream enthaltenen Bytes erzeugen
aByteStream.Size := aByteStream.Size + iHashLengthInBytes; // die Größe des ALTEN streams um maximale Länge des Hashs vergrößern (?)
Move(AnsiString(sHash)[1], aByteStream.Bytes[aByteStream.Size - iHashLengthInBytes], iHashLengthInBytes); // Hash im alten Stream ablegen
aByteStream.SaveToFile(aFileName); // Stream speichern
Den Dateiinhalt mit am Ende hängenden Hash, lese ich so aus
Delphi-Quellcode:
if aByteStream.Size > iHashLengthInBytes then
begin
aByteStream.Read(aByteStream.Bytes[0], aByteStream.Size - iHashLengthInBytes);
Result := THashFunctions_Selftest.CalcHash(Trim(TEncoding.ANSI.GetString(aByteStream.Bytes, 0, aByteStream.Size - iHashLengthInBytes)));
end;
// Dateiinhalt könnte sein: _TEST_TEST_2B3CC5E89E09A889CC10D0021284AB06EA6FF72BCFE78110C8D9B71A6030375F
// Ausgelesen wird dann "_TEST_TEST_" und davon er Hash gebildet.