AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MD5-Hashwert als 40-stellige Dezimalzahl

Ein Thema von bcvs · begonnen am 8. Dez 2021 · letzter Beitrag vom 9. Dez 2021
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#1

MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:16
Hallo zusammen,

ich brauche einen MD5-Hashwert als 40-stellige Dezimalzahl. Ich habe den Hash wie üblich als 32-stelligen Hex-Wert. Wie kriege ich jetzt daraus einen 40-stelligen Dezimalwert?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:25
https://www.delphipraxis.net/3526-hextoint.html
  Mit Zitat antworten Zitat
TiGü

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

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:28
Das kann doch dann nur auf Stringbasis funktionieren, weil als Zahl lehnt der Compiler das ab:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  try
    var HexValue: UInt64 := $11111111111111111111111111111111;
    var HexValue2: UInt64 := $FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Code:
[dcc32 Error] Project1.dpr(12): E2102 Integer constant too large
[dcc32 Error] Project1.dpr(13): E2102 Integer constant too large
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:32
Dann nimm das eben als 4x4 Integer/Cardinal.


Willst du das nun als "eine" Dezimalzahl oder einfach nur "binär" haben?
$2B or not $2B
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#5

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:36
Zitat:
Das kann doch dann nur auf Stringbasis funktionieren, weil als Zahl lehnt der Compiler das ab:
Genau, so weit war ich auch schon.

StrToInt geht nicht, denn das Ergebnis müsste ein 128-bit-integer sein, ist also viel zu groß.

Also bräuchte ich etwas auf Stringbasis. Oder eine MD5-Function, die gleich den Dezimalwert als String liefert.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#6

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:43
Willst du das nun als "eine" Dezimalzahl oder einfach nur "binär" haben?
Aus einer Dokumentation für das Projekt, an den ich arbeite:

Zitat:
Der aus der MD-5 Hashfunktion resultierende 128 Bit-Wert wird in eine 40-stellige Dezimalzahl mit Vornullen umgewandelt.
Dieser 40-stellige String muss dann wieder aufgeteilt und an verschiedene Stellen in ein Formular gedruckt werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 8. Dez 2021, 14:45
Joar, nativ kannst das in Delphi nunmal dann nur als String umsetzen.
Und "führende Nullen" besagen auch, dass es eine Stringrepresentation sein soll.

StrToInt geht nicht, denn das Ergebnis müsste ein 128-bit-integer sein, ist also viel zu groß.
Es gibt auch StrToInt64, aber da Delphi standardmäßig keinen 128-Bit Typen besitzt und somit auch kein passendes StrToIntXyz, bleibt es hier nunmal hängen.

Man könnte aber z.B. mit einer BigInt-Implementation hier eine Lösung finden, falls man das nicht selber binär in Integer aufteilen will, mit denen man dann arbeiten kann.



Delphi hat im 32-Bit-Compiler (System.pas) sogar Beispielcodes/-funktionen drin,
wo mit zwei Integern der Int64 emuliert wird.

Das kann man mathematisch problemlos auch auf 2xInt64 für einen Int128 umstellen.



Im Prinzip dividiert man erst den oberen Int64 durch 10, speichert darin wieder den Wert,
nimmt den Rest mit in den unteren Int64 und dividiert ebenfalls durch 10 und speichert.
Davon wieder der Rest nimmt man und speichert ihn im String, von rechts nach Links.
Und so bekommt man Stück für Stück den großen Dezimalstring.

Man kann auch einfach mit 4 Integern oder 8 Words oder 16 Bytes speichern/rechnen
und natürlich auch durch 100, 1000, 10000 oder so ... das dann natürlich jeweils mit führenden Nullen gefüllt und die Zahlenblöcke in den Dezimalstring kopiert.
(z.B. bei Byte durch 10, bei Word durch 1000 oder bei LargeWord/Integer durch 100000000, sowie unter 32 Bit würde ich mit Word und unter 64 Bit mit LongWord rechnen, um keine Überläufe in nativen Typen für die CPU zu haben).
$2B or not $2B

Geändert von himitsu ( 9. Dez 2021 um 13:45 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#8

AW: MD5-Hashwert als 40-stellige Dezimalzahl

  Alt 9. Dez 2021, 12:46
Ich habe es jetzt mit den BigIntegers von Rudy Velthuis gelöst:
http://rvelthuis.de/programs/bigintegers.html

Damit wird die Angelegenheit zum Zweizeiler:

Delphi-Quellcode:
var A:BigInteger;

A:= '$098f6bcd4621d373cade4e832627b4f6';
Label1.Caption:=A.ToString;
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:24 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