Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Gemeinsamer Vorfahre von DEC THash_XYZ gesucht (erledigt) (https://www.delphipraxis.net/192591-gemeinsamer-vorfahre-von-dec-thash_xyz-gesucht-erledigt.html)

a.def 3. Mai 2017 09:32


Gemeinsamer Vorfahre von DEC THash_XYZ gesucht (erledigt)
 
Gibt es einen gemeinsamen Vorfahren der Hashes in DEC welchen ich als Parameter verwenden kann?

Mein Ziel: ich möchte eine einzige Prozedur haben, welcher ich einen String und den Hash-Typ übergeben kann welcher verwendet werden soll.

Der Code hier unten stammt aus dem WWW und wurde von mir leicht abgeändert.
Delphi-Quellcode:
function CalcHash(input: string; aHashMethod: TDECHash): string;
var
 val: TStringStream;
 aHash: TDECHash;
 len: Int64;
begin
 val := TStringStream.Create;
 try
  len := Length(input);
  val.Write(input[1], len);
  val.Position := 0;

  aHash := aHashMethod.Create;
  try
   Result := string(aHash.CalcStream(val, len, TFormat_HEX));
  finally
   aHash.Free;
  end;
 finally
  val.Free;
 end;
end;

// s := CalcHash(s, TDECHash(THash_SHA256));
Ich dachte eigentlich TDECHash wäre der gemeinsame Vorfahre, aber der Code gibt eine AV zurück, welche ich nicht zurückverfolgen kann.

CCRDude 3. Mai 2017 09:40

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Der Parameter müsste TDECHashClass heißen, nicht TDECHash, sonst würdest Du ja ein Objekt übergeben...

himitsu 3. Mai 2017 09:42

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Mit TDECHash hätte vorher auch schon im Compiler knallen müssen, wenn du da versuchst eine Klasse zu übergeben.
Wie rufst du denn CalcHash auf?

TDECHashClass geht auch nur, wenn Create virtual ist, denn sonst wird da nicht das Create der übergebenen Klasse, sondern nur das von TDECHashClass verwendet.
Was hier der Fall ist ... keine Ahnung.

a.def 3. Mai 2017 09:43

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Dann bekomme ich leider den Fehler
Zitat:

[dcc32 Fehler]Inkompatible Typen: 'TDECHashClass' und 'TDECHash'

a.def 3. Mai 2017 10:17

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Zitat:

Zitat von himitsu (Beitrag 1369973)
Wie rufst du denn CalcHash auf?.

So sieht das bei mir aus
Delphi-Quellcode:
function CalcHash(input: string; aHashMethod: TDECHash): string;
var
 val: TStringStream;
 aHash: TDECHash;
 len: Int64;
begin
 val := TStringStream.Create;
 try
  len := Length(input);
  val.Write(input[1], len);
  val.Position := 0;

  aHash := aHashMethod.Create;
  try
   Result := string(aHash.CalcStream(val, len, TFormat_HEX));
  finally
   aHash.Free;
  end;
 finally
  val.Free;
 end;
Aufruf lautet
Delphi-Quellcode:
s := CalcHash(s, TDECHash(THash_SHA256));

CCRDude 3. Mai 2017 10:23

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Zitat:

Zitat von himitsu (Beitrag 1369973)
Mit TDECHash hätte vorher auch schon im Compiler knallen müssen, wenn du da versuchst eine Klasse zu übergeben.
Wie rufst du denn CalcHash auf?

TDECHashClass geht auch nur, wenn Create virtual ist, denn sonst wird da nicht das Create der übergebenen Klasse, sondern nur das von TDECHashClass verwendet.
Was hier der Fall ist ... keine Ahnung.

Ich verwende das schon lange erfolgreich, daher die Korrektur :)

Da typecasten im Aufruf sollte noch weg...

a.def 3. Mai 2017 10:39

AW: Gemeinsamer Vorfahre von DEC THash_XYZ gesucht
 
Delphi-Quellcode:
var
 aHashActive: TDECHashClass = THash_SHA256;

...

class function THashFunctions_Selftest.CalcHash(input: string): string;
var
 val: TStringStream;
 aHash: TDECHash;
 len: Int64;
begin
 val := TStringStream.Create;
 try
  len := Length(input);
  val.Write(AnsiString(input)[1], len);
  val.Position := 0;

  aHash := aHashActive.Create;
  try
   Result := string(aHash.CalcStream(val, len, TFormat_HEX));
  finally
   aHash.Free;
  end;
 finally
  val.Free;
 end;
end;

s := THashFunctions_Selftest.CalcHash(s);
Funktioniert ausgezeichnet, Danke!

Nur um den Grund mal genannt zu haben warum ich DEC verwende statt das mitgelieferte von Delphi:
die in Delphi integrierten Hash-Funktionen sind einfach viel zu lahm! Was DEC in 50ms macht dafür braucht der Delphi-eigene Code 200ms.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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