Autor |
Beitrag |
TheQuestion
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Do 17.06.10 13:40
|
|
TheQuestion 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 17.06.10 14:02
Gammatester hat folgendes geschrieben : | TheQuestion hat folgendes geschrieben : |
*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: | ... TheQuestion hat folgendes geschrieben : |
*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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function md5 (pattern : string): string; begin result := MD5Print(MD5String(pattern)); end; |
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Do 17.06.10 14:14
TheQuestion hat folgendes geschrieben : | 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: TheQuestion hat folgendes geschrieben : | 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.
TheQuestion hat folgendes geschrieben : |
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function md5 (pattern : string): string; begin result := MD5Print(MD5String(pattern)); end; | |
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 Narses: 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:
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}
const md5: array[0..15] of 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; for i:=0 to 15 do begin w := (w shl 8) or md5[i]; w := w mod b; end; writeln('md5 mod b = ', w); end. |
Die Ausgabe ist (nicht unerwartet): md5 mod b = 7225
|
|
TheQuestion 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Do 24.06.10 18:20
TheQuestion hat folgendes geschrieben : | 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.
|
|
|