Autor Beitrag
TheQuestion
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 17.06.10 13:05 
(Vorrausgehender Thread: MD5 Hash erzeugen)

Ich möchte ein Beispielprogramm für Hashtabellen erstellen.
Der Hash soll dabei vom Typ MD5 sein, es werden immer Daten vom Typ String in einen MD5 Hash umgewandelt.
Anschließend möchte ich mit dem 128bit breiten MD5-Hash rechnen, eine Modulus Berechnung.

Wie kann ich das realisieren:
*Ich könnte eine langsame Rechenoperation mit den vollen 128bit durchführen. Dies ist aber sicher signifikant langsamer. Wenn nicht, wie müsste ich das dann realisieren?
*Ich könnte den MD5 String kürzen, und dann in einen 32bit Integer umwandeln. Wie kürze ich einen String auf 32bit, wo finde ich die Grenze?

Beides ist möglich, da die Berechnung nicht exakt aber das Ergebnis immer gleich sein muss.

Was könnt ihr mir empfehlen?

Edit: Wichtig zu beachten: Das Ergebnis dieser Rechenoperation ist auf jeden Fall ein Integer, warscheinlich sogar ein ShortInt.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 17.06.10 13:40 
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:

*Ich könnte eine langsame Rechenoperation mit den vollen 128bit durchführen. Dies ist aber sicher signifikant langsamer. Wenn nicht, wie müsste ich das dann realisieren?

Hängt von Modulus-Bitgröße ab, bei 32Bit-Integer sind's halt vier 32Bit-Divisionen mit Rest, bei 8Bit Modulus entsprechend 16 8Bit-Divisionen.
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:

*Ich könnte den MD5 String kürzen, und dann in einen 32bit Integer umwandeln. Wie kürze ich einen String auf 32bit, wo finde ich die Grenze?

Es ist völlig unsinnig, erst den Hash in einen String zu verwandeln, dann zurückwandeln, und dann abschneiden. Du hast doch schon die 128 Bit (wahrscheinlich als 16 Bytes oder als 4 Integer); dann nimm halt den wertniedrigsten Integer.
TheQuestion Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 17.06.10 14:02 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:

*Ich könnte eine langsame Rechenoperation mit den vollen 128bit durchführen. Dies ist aber sicher signifikant langsamer. Wenn nicht, wie müsste ich das dann realisieren?

Hängt von Modulus-Bitgröße ab, bei 32Bit-Integer sind's halt vier 32Bit-Divisionen mit Rest, bei 8Bit Modulus entsprechend 16 8Bit-Divisionen.
Ich weiß nicht, ob es das ist, was du meintest: Das Ergebnis kann nie Größer werden, als die Zahl die hinter dem Modulus-Zeichen steht. Also a%b = c, dann ist c maximal b-1 groß, oder?
Und, c ist bei mir nur ca 100-1000, das ist fast nichtmal einen 32bit int wert ;-)


Zitat:
...
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:

*Ich könnte den MD5 String kürzen, und dann in einen 32bit Integer umwandeln. Wie kürze ich einen String auf 32bit, wo finde ich die Grenze?

Es ist völlig unsinnig, erst den Hash in einen String zu verwandeln, dann zurückwandeln, und dann abschneiden. Du hast doch schon die 128 Bit (wahrscheinlich als 16 Bytes oder als 4 Integer); dann nimm halt den wertniedrigsten Integer.

Das ist richtig. Wie kriege ich denn was anderes von der "MD5 Message-Digest for Delphi 4" Bibliothek? WIe kann ich das realisieren?
Bisher hab ich mir dafür das gebastelt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
{ Create md5 string out of a string
  Transmit only variables of the type string to make shure that you get also compareable
  bit strings, because 123 as integer produces an other md5 hash than the string "123" }

function md5 (pattern : string): string;
begin
        result := MD5Print(MD5String(pattern));
end//noitcnuf
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 17.06.10 14:14 
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:
Das Ergebnis kann nie Größer werden, als die Zahl die hinter dem Modulus-Zeichen steht. Also a%b = c, dann ist c maximal b-1 groß, oder?
Und, c ist bei mir nur ca 100-1000, das ist fast nichtmal einen 32bit int wert ;-)
Das paßt aber nicht zu Deinem ersten Beitrag:
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:
Edit: Wichtig zu beachten: Das Ergebnis dieser Rechenoperation ist auf jeden Fall ein Integer, warscheinlich sogar ein ShortInt.
Integer: 32 Bit, ShortInt: 8bit! Was also ist b? Außerdem mußt Du klären, ob der Hash als Big- oder Little-Endian-128Bit-Zahl aufzufassen ist.
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:

Das ist richtig. Wie kriege ich denn was anderes von der "MD5 Message-Digest for Delphi 4" Bibliothek? WIe kann ich das realisieren?
Bisher hab ich mir dafür das gebastelt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
{ Create md5 string out of a string
  Transmit only variables of the type string to make shure that you get also compareable
  bit strings, because 123 as integer produces an other md5 hash than the string "123" }

function md5 (pattern : string): string;
begin
        result := MD5Print(MD5String(pattern));
end//noitcnuf
Dann nimm halt keinen String, sondern gleich den 128-Bit-Hash. Eine MD5-Unit, die das nicht kann, sollte man besser nicht benutzen.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Und? Hier mal zwischendurch ein hoffentlich klärendes Beispiel.

MD5('abc') wird normalerweise als Hexstring 900150983CD24FB0D6963F7D28E17F72 ausgegeben. Mit einem MPArith-Rechner kannst Du jetzt $900150983CD24FB0D6963F7D28E17F72 mod 12345 = 7225 bestimmen. Hier ein Pascalprogramm, das md5 mod 12345 ausrechnet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
program md5mod;

{$ifdef win32}
{$apptype console}
{$endif}

{md5('abc')=900150983CD24FB0D6963F7D28E17F72}
{Beispiel: md5('abc') mod 12345 = 7225.}

const
  md5: array[0..15of byte = ($90,$01,$50,$98,$3c,$d2,$4f,$b0,$d6,$96,$3f,$7d,$28,$e1,$7f,$72);
var
  i: integer;
  w: longint;
  b: word;
begin
  b := 12345;
  w := 0;
  {Interpretation md5 als Big-Endian, sonst i:=15 downto 0}
  for i:=0 to 15 do begin
    w := (w shl 8or md5[i];
    w := w mod b;
  end;
  writeln('md5 mod b = ', w);
end.

Die Ausgabe ist (nicht unerwartet): md5 mod b = 7225
TheQuestion Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 24.06.10 16:41 
Ich habe nun verstanden, wie es funktioniert.
Bei deinem Funktionsbeispiel: Das Ergebnis (w) kann nicht größer werden als b, oder?
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Do 24.06.10 18:20 
user profile iconTheQuestion hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe nun verstanden, wie es funktioniert.
Bei deinem Funktionsbeispiel: Das Ergebnis (w) kann nicht größer werden als b, oder?

Richtig. An Schleifenende und hinter der Schleife ist wegen w := w mod b, immer 0 <= w < b.