Einzelnen Beitrag anzeigen

a.def
(Gast)

n/a Beiträge
 
#89

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 13:02
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.

Geändert von a.def ( 5. Mai 2017 um 13:09 Uhr)