![]() |
THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Liste der Anhänge anzeigen (Anzahl: 1)
Na toll, extra auf 10.2.1 gewartet damit die ärgsten Scharten ausgewetzt sind und nun funktioniert die Hashfunktion, die bisher klagslos ihren Dienst versehen hat, nicht mehr?
Ich hab eine kleine Demo angehängt, unter 10.1 Berlin kann man sie compilieren, eine Datei öffnen und eine SHA1 berechnen lassen. Macht man das mit der selben Datei mehrmals kommt auch immer die selbe Prüfsumme heraus. Das selbe Programm unter 10.2.1 compiliert lässt sich im günstigsten Fall als Zufallsgenerator verwenden ("kleine" Dateien bringen bei jedem öffnen einen neuen Wert) oder man kriegt eine Zugriffsverletzung um die Ohren gehauen ("große" Dateien?)... Kann das jemand nachvollziehen? Edit: Geht auch mit Anhang. |
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Anhang fehlt
|
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Nach dem Studium und Vergleich der Quelltexte zwischen Berlin und Tokyo...probiere es mal ab Tokyo so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin if OpenDialog1.Execute then begin Edit1.Text := THashSHA1.GetHashStringFromFile(OpenDialog1.FileName); end; end; |
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Sicher, daß das je richtig gelaufen ist? IMO gibt es (laut Hilfe) kein Overlay für TMemoryStream. Dein Code bringt auch unter 10.2 falsche Ergebnis. Ich vermute, es wird der Zweig für
Delphi-Quellcode:
verwendet.
Update(const AData; ALength: Cardinal); overload;
|
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Zitat:
Delphi-Quellcode:
Da wird der Zeiger auf den internen Buffer und die Größe übergeben. Er übergibt NICHT LFile direkt.
procedure TForm1.Button1Click(Sender: TObject);
Var LSHA1: THashSHA1; LFile: TMemoryStream; begin if OpenDialog1.Execute then begin LFile := TMemoryStream.Create; try LFile.LoadFromFile(OpenDialog1.FileName); LSHA1 := THashSHA1.Create; LSHA1.Update(LFile.Memory, LFile.Size); Edit1.Text := LSHA1.HashAsString; finally LFile.Free; end; end; end; |
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Zitat:
Ich bin mir auch nicht sicher ob das ein Problem von THashSHA1 ist oder ob es nicht eher ein Compiler-Problem ist? Soweit ich das jetzt sehe wird die "falsche" Update-Methode aufgerufen... Mit
Delphi-Quellcode:
kann man die richtige Methode erzwingen ... aber so ein Hardcast an dieser Stelle ist doch extrem unschön?
LSHA1.Update(TBytes(LFile.Memory), LFile.Size);
|
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Zitat:
|
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Zitat:
Da hab ich jetzt irgendwie mit einen Auge Unterschiede beim Debuggen gesehen. Alternativ TBytesStream verwenden? Dann mit LFile.Bytes (von Typ TBytes) übergeben? |
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Zitat:
Beispiel: Dateigröße im System: 296759 LFile.Size: 296759 Length(TBytes(LF..)): 327684 Zitat:
Delphi-Quellcode:
Scheint es zu funktionieren, auch hier ist
LSHA1.Update(LFile.Bytes, LFile.Size);
Delphi-Quellcode:
, aber soweit ich das verstehe entspricht Length(LFiles.Bytes) LFiles.Capacity und die kann natürlich größer sein!
Length(LFiles.Bytes) <> LFile.Size
Das erklärt dann auch gleich die Zahlen im ersten Fall! Ich nehme sogar an, das im ersten Fall (casten) ein TArray<Byte> erzeugt wird und die Daten dahin umkopiert werden, bevor die Updatemethode aufgerufen wird. Bleibt noch festzuhalten, dass unter 10.1 die folgende Methode aufgerufen wurde:
Delphi-Quellcode:
Und in 10.2.1 diese:
procedure THashSHA1.Update(const AData: TBytes; ALength: Cardinal = 0);
var Len: Integer; begin if ALength = 0 then Len := Length(AData) else Len := ALength; Update(PByte(AData), Len); end;
Delphi-Quellcode:
und mit dem PByte(@AData) greifen wir nicht mehr auf unseren Buffer zu, sondern auf den Speicher wo AData liegt...
procedure THashSHA1.Update(const AData; ALength: Cardinal);
begin Update(PByte(@AData), ALength); end; |
AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Ich habe es gerade auch mal durchgespielt, zur Sicherheit auch noch die System.Hash von Tokio ins Projekt
kopiert und zu test.Hash umbenannt . Berlin und Tokio rufen unterschiedliche Funktionen auf. Das ist gar nicht schön....
Code:
Wobei beide jetzt gegen test.Hash kompiliert haben.
Berlin:
procedure THashSHA1.Update(const AData: PByte; ALength: Cardinal); Tokio: procedure THashSHA1.Update(const AData; ALength: Cardinal); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz