RFZ: halber Hashwert = vollwertiger Hashwert?

Nabend,
die Frage beschäftigt mich rein Interessehalber, leider hab ich dazu bei diversen Quellen zu Hash-Funktionen nichts gefunden.

Wenn ich von einem Hash-Wert nur einen Teil betrachte, ist dieser Teil dann immernoch ein vollwertiger Hash-Wert? Natürlich erhöht sich die Kollisionswahrscheinlichkeit wenn ich die Hash-Länge verkürze, aber bleiben sonst alle Eigenschaften einer Hash-Funktion erhalten?

Soweit ich die Definition einer guten Hash-Funktion verstehe, müsste das eigentlich so sein.

Konkretes Beispiel wäre, ich verwende von einem MD5 Wert nur 10 statt der 32 Hex-Stellen, da dieser Hash-Wert u.U. von einem Nutzer per Hand getippt wird und ich ihm damit Arbeit ersparen möchte.

Ich gehe also davon aus, dass ich in diesem Fall die Kollisionswahrscheinlichkeit um den Faktor 2^88 (40 Bit statt 128 Bit) erhöht hätte, oder?
Kann man das so betrachten?

Gruß,
Andreas

  1. echo ($light == true) ? 'Guten Tag,' : 'Guten Abend,';

    also eine konkrete Antwort auf deine Frage habe ich nicht (wobei ich davon ausgehe das deine Aussagen zutreffen). Aber du könntest den MD5 Hash auch verkürzen indem du ihn anders Darstellst, zum Beispiel durch eine Darstellung zur Basis 64 anstatt der Hexadezimalen. Dadurch musst du zwar mehr verschiedene Zeichen eingeben aber halt weniger.

    Grüße

    Markus

    --
    Langeweile? Sudoku online spielen ;)
    1. Hi,

      Aber du könntest den MD5 Hash auch verkürzen indem du ihn anders Darstellst, zum Beispiel durch eine Darstellung zur Basis 64 anstatt der Hexadezimalen. Dadurch musst du zwar mehr verschiedene Zeichen eingeben aber halt weniger.

      Wenn es aber darum geht, eben diesen Hash von Nutzern irgendwo "abtippen" zu lassen, halte ich das fuer keine gute Idee.
      Der gemeine Affenabkoemmling ist mit den Ziffern und einer geringen Auswahl aus dem normalen lateinischen Alphabet schon genug gefordert, selbst wenn man das ganze case insensitive haelt.
      Jedes "Mehr" erhoeht das sicher nur die Fehlerquote.

      MfG ChrisB

      1. Aber du könntest den MD5 Hash auch verkürzen indem du ihn anders Darstellst, zum Beispiel durch eine Darstellung zur Basis 64 anstatt der Hexadezimalen. Dadurch musst du zwar mehr verschiedene Zeichen eingeben aber halt weniger.

        Wenn es aber darum geht, eben diesen Hash von Nutzern irgendwo "abtippen" zu lassen, halte ich das fuer keine gute Idee.

        wenns darum geht, das ding in einer datenbank zu speicher spart man damit a aber gute 50% platz und braucht stat 32 bytes nur 16 bytes zur speicherung eines md5 hash - beim auslesen kann man das ganze ja wieder zurückrechnen und hat nix verloren

        1. echo $begrüßung;

          Aber du könntest den MD5 Hash auch verkürzen indem du ihn anders Darstellst, [...]
          wenns darum geht, das ding in einer datenbank zu speicher spart man damit a aber gute 50% platz und braucht stat 32 bytes nur 16 bytes zur speicherung eines md5 hash

          Ein MD5-Wert sind genau 16 Byte. Die 32 Byte kommen zustande, wenn man ihn durch Hex-Darstellung lesbarer gestaltet. Siehe PHP-Funktion md5(), Parameter raw_output.

          echo "$verabschiedung $name";

          1. Ein MD5-Wert sind genau 16 Byte. Die 32 Byte kommen zustande, wenn man ihn durch Hex-Darstellung lesbarer gestaltet. Siehe PHP-Funktion md5(), Parameter raw_output.

            sag ich ja - ein 128-bit-md5-hash hat genau 16 bytes - die meisten leute speichern die dinger in datenbanken aber als char/varchar/text - das benötigt dann konsequenterweise bei 32 hexadezimalziffern 32 bytes

            1. Hallo suit,

              sag ich ja - ein 128-bit-md5-hash hat genau 16 bytes - die meisten leute speichern die dinger in datenbanken aber als char/varchar/text - das benötigt dann konsequenterweise bei 32 hexadezimalziffern 32 bytes

              Hexadezimalzahlen heißen so, weil es 16 Ziffern gibt. Also kann man mit einer Ziffer 4 Bit codieren. 128/4 = 32 Ziffern und damit Bytes. Das Ergebnis ist also das gleiche, aber Deine Begründung stimmt nicht ;-)

              Base64 hat 64 "Ziffern", also 6 Bit/Ziffer.
              Damit benötigt man dann 128/6 = 21 + 1/3 Bytes, Da Base64 auf 3-Byte-Blöcken arbeitet also wohl 24

              Um mit 16 durch zu kommen, darf man gar keine solche Codierung verwenden, sondern muss die Daten direkt ablegen.
              Bei Datenbanken ist das allerdings alles Witzlos, da wird es auf die paar Byte nicht ankommen.

              Grüße

              Daniel

    2. Moin Markus,

      also eine konkrete Antwort auf deine Frage habe ich nicht (wobei ich davon ausgehe das deine Aussagen zutreffen). Aber du könntest den MD5 Hash auch verkürzen indem du ihn anders Darstellst, zum Beispiel durch eine Darstellung zur Basis 64 anstatt der Hexadezimalen. Dadurch musst du zwar mehr verschiedene Zeichen eingeben aber halt weniger.

      ja, das wäre eine Idee die ich mir auch schon überlegt habe - wobei ich das komplizierter angehen würde und einfach direkt auf das ganze Alphabet aber ohne Sonderzeichen abbilden würde.

      Allerdings kann ich bei meinem Beispiel wirklich mit einer höheren Kollisionswahrscheinlichkeit leben, denn im konkreten Fall ist die Mächtigkeit der Menge über die ich die Hash-Werte bilde sehr begrenzt (weit kleiner als 2^128), den vollen Hash-Wert zu verwenden finde ich daher recht unnötig.

      Schonmal danke an alle bisherigen Antworten :)

      Gruß,
      Andreas

  2. Hallo RFZ,

    Wenn ich von einem Hash-Wert nur einen Teil betrachte, ist dieser Teil dann immernoch ein vollwertiger Hash-Wert?

    Ja.

    Ich gehe also davon aus, dass ich in diesem Fall die Kollisionswahrscheinlichkeit um den Faktor 2^88 (40 Bit statt 128 Bit) erhöht hätte, oder?

    Ja.

    (Man kann Gegenbeispiele konstruieren, wo mein einfaches "Ja" nicht wirklich zutreffend wäre, aber bei gängigen Hash-Funktionen trifft deine Annahme zu)

    Jonathan