AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi THashSHA1 funktioniert nicht mehr in 10.2(.1)?
Thema durchsuchen
Ansicht
Themen-Optionen

THashSHA1 funktioniert nicht mehr in 10.2(.1)?

Ein Thema von Whookie · begonnen am 24. Aug 2017 · letzter Beitrag vom 25. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 14:54
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.
Angehängte Dateien
Dateityp: 7z SHA1Hash.7z (4,2 KB, 8x aufgerufen)
Whookie

Software isn't released ... it is allowed to escape!

Geändert von Whookie (24. Aug 2017 um 14:59 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 14:55
Anhang fehlt
Markus Kinzler
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:22
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;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:35
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  Update(const AData; ALength: Cardinal); overload; verwendet.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:38
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  Update(const AData; ALength: Cardinal); overload; verwendet.
Also Whookie verwendet diesen Code:

Delphi-Quellcode:
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;
Da wird der Zeiger auf den internen Buffer und die Größe übergeben. Er übergibt NICHT LFile direkt.
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:41
    Edit1.Text := THashSHA1.GetHashStringFromFile(OpenDialog1.FileName);
Das geht mal, leider habe ich den TMemoryStream in Verwendung, weil meine "Dateien" nicht wirklich aus dem Dateisystem stammen, sondern syntetisch entstehen (und auch zum Teil sehr groß sind).

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
  LSHA1.Update(TBytes(LFile.Memory), LFile.Size); kann man die richtige Methode erzwingen ... aber so ein Hardcast an dieser Stelle ist doch extrem unschön?
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:41
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  Update(const AData; ALength: Cardinal); overload; verwendet.
Ja sicher, ich hab hier beide Versionen am laufen ...
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 15:53
Das geht mal, leider habe ich den TMemoryStream in Verwendung, weil meine "Dateien" nicht wirklich aus dem Dateisystem stammen, sondern syntetisch entstehen (und auch zum Teil sehr groß sind).

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
  LSHA1.Update(TBytes(LFile.Memory), LFile.Size); kann man die richtige Methode erzwingen ... aber so ein Hardcast an dieser Stelle ist doch extrem unschön?
Vergleich doch mal, ob LFile.Size und Length(TBytes(LFile.Memory)) exakt gleich groß sind.
Da hab ich jetzt irgendwie mit einen Auge Unterschiede beim Debuggen gesehen.

Alternativ TBytesStream verwenden? Dann mit LFile.Bytes (von Typ TBytes) übergeben?
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 16:12
Vergleich doch mal, ob LFile.Size und Length(TBytes(LFile.Memory)) exakt gleich groß sind.
Das ist ja interessant, die sind tatsächlich unterschiedlich???!

Beispiel:
Dateigröße im System: 296759
LFile.Size: 296759
Length(TBytes(LF..)): 327684


Alternativ TBytesStream verwenden? Dann mit LFile.Bytes (von Typ TBytes) übergeben?
Mit TByteStream und

LSHA1.Update(LFile.Bytes, LFile.Size); Scheint es zu funktionieren, auch hier ist

Length(LFiles.Bytes) <> LFile.Size , aber soweit ich das verstehe entspricht Length(LFiles.Bytes) LFiles.Capacity und die kann natürlich größer sein!

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:
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;
Und in 10.2.1 diese:
Delphi-Quellcode:
procedure THashSHA1.Update(const AData; ALength: Cardinal);
begin
  Update(PByte(@AData), ALength);
end;
und mit dem PByte(@AData) greifen wir nicht mehr auf unseren Buffer zu, sondern auf den Speicher wo AData liegt...
Whookie

Software isn't released ... it is allowed to escape!

Geändert von Whookie (24. Aug 2017 um 16:26 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: THashSHA1 funktioniert nicht mehr in 10.2(.1)?

  Alt 24. Aug 2017, 16:51
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:
Berlin:
   procedure THashSHA1.Update(const AData: PByte; ALength: Cardinal);
 
Tokio:
 procedure THashSHA1.Update(const AData; ALength: Cardinal);
Wobei beide jetzt gegen test.Hash kompiliert haben.
Fritz Westermann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz