Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich brauche einen 64 Bit Hashcode für eine String,
zB:
2012-10-02 18:09:01.308
Via google sind mir einige Lösungsvorschläge zugefallen, aber ich verstehe sie nicht, zb ...digest...
Java ibt ebenfalls einige Möglichkeiten zum Hashen vor, die mir genauso wenig sagen.
Ich hoffe Ihr könnt etwas Licht rein bringen.
Wie könnte eine Methode in Java dazu aussehen?
Allgemein: Wie wird überhaupt ein Hashwert generiert?
Eine einfache Hashfunktion erhälst du, wenn du jeden String so lässt, wie er ist (Identität).
Eine weitere sehr einfache Hashfunktion ist die Abbildung aller Strings auf einen Wert.
Du kannst auch den ersten Buchstaben eines Strings nehmen oder die Quersumme bilden...
Die Möglichkeiten sind unbegrenzt.
Aber ich kann leider nicht bei den einfachen Funktionen bleiben, ich brauche eine mit möglichst wenig Kollisionen, die aber trotzdem noch eine brauchbare Geschwindigkeit bringt und das Ganze 64 bit lang
Eine einfache Hashfunktion erhälst du, wenn du jeden String so lässt, wie er ist (Identität).
Eine weitere sehr einfache Hashfunktion ist die Abbildung aller Strings auf einen Wert.
Du kannst auch den ersten Buchstaben eines Strings nehmen oder die Quersumme bilden...
Die Möglichkeiten sind unbegrenzt.
Deine Antwort suggeriert, dass du das auch nicht erklären kannst.
Aber da bist du auch nicht der Einzige.
Allgemein bedeutet "Hashcode" wohl, dass die eigentliche Information durch eine andere, i.d.R. kürzere ersetzt wird. Wenn es um Programmierung geht, kann das evtl. nur bedeuten, dass statt des gespeicherten Objekts eine Referenz zum gespeicherten Objekt gehandelt wird.
Bei einer Verschlüsselung (Kryptologie) sieht das dann wieder etwas anders aus, auch wenn es da sicherlich gewisse Parallelen gibt.
Insofern ist das Wort "Hashcode" wohl nichts, was eindeutig interpretierbar ist.
Deine Frage geht wohl in Richtung Verschlüsselungstechnik, wozu ich im Grunde garnichts sagen kann....
Ich entwickle grade Algorithmen zum Verschlüsseln und um eine Idee umzusetzen brauche ich einen Hashcode, aber ja, sieht anscheinend schwierig aus, einfach schnell einen zu basteln ;(
Aber ich kann leider nicht bei den einfachen Funktionen bleiben, ich brauche eine mit möglichst wenig Kollisionen, die aber trotzdem noch eine brauchbare Geschwindigkeit bringt und das Ganze 64 bit lang
Da musst du wohl etwas konkreter werden. Was genau willst du wie verschlüsseln und warum? Einweg-Verschlüsselung (=Hashwerte), symmetrische oder asymmetrische Verschlüsselung? Was ist dir wichtiger: Geschwindigkeit oder Sicherheit? Und warum überhaupt 64 Bit?
Im Gegensatz zu Hashfunktionen wie in java.lang.String oder java.lang.Integer sind kryptografisch sichere Hashfunktionen meist viel aufwändiger zu berechnen. Das dient nicht nur dem Zweck der Kollisionsfreiheit, sondern soll es möglichst schwierig machen, aus dem Hashwert die ursprüngliche Nachricht zu berechnen.
Beispiel:
Code:
java.lang.Integer.hashCode()
ist kollisionsfrei und sogar wahnsinnig schnell zu berechnen. Leider verrät dieser Hashcode die ursprüngliche Nachricht, und diese ist ebenso schnell zu rekonstruieren: Der Hashcode ist die ursprüngliche Nachricht.
Kollisionsfreiheit ist also nicht unbedingt das entscheidende Kriterium. Und je kürzer dein Hashwert wird, desto unsicherer ist er (einfach gesagt). Außerdem kommt es auch auf die Nachrichten an, die du verschlüsseln willst. Um bei deinem Beispiel zu bleiben: Wenn du nur Strings, die Zeitstempel mit Millisekunden-Genauigkeit widerspiegeln, verschlüsseln willst, also z.B.
"2012-10-02 18:09:01.308",
dann gibt es für jeden Tag nur 1000 * 60 * 60 * 24 = 86400000 verschiedene Kryptogramme. Wenn dem Angreifer also der Tag bekannt ist oder er den zu untersuchenden Zeitraum stark eingrenzen kann, ist die Verschlüsselung (unabhängig vom konkreten Verfahren) so gut wie nutzlos. Etwas allgemeiner gesagt: Es werden viel, viel weniger Bit an Informationen (sprich: Entropie) in deinem Hashwert übrig bleiben als 64. Für den Zeitraum vom Jahr 2000 bis zum Jahr 2100, also 100 Jahre, werden z.B. nur ld(1000 * 60 * 60 * 24 * 365,25 * 100), also ungefähr 41,521 Bit benötigt – vorausgesetzt natürlich, es bleibt bei solchen Zeitstempeln.
Danke schonmal fürr diese Antwort, das bringt mich schon etwas weiter.
Mein eigentliches Verschlüsseln kommt nachher, fragt bitte nicht wieso, damit könnte ich grade dutzende Seiten füllen :autsch:
zum Zeitstempel kommt nachher schon noch was dazu, war nur ein Beispiel, anscheinend etwas unglücklich.
Sicherheit ist wichtig, ich will nicht das jemand vom Hashwert auf die Nachricht kommt.
Aber zum ausprobieren reicht etwas halbwegssicheres, das sich schnell berechnen lässt.
Nach deiner Erklärung ist auch Kollisionsfreiheit nicht mehr das wichtigste.
Sicherheit ist wichtig, ich will nicht das jemand vom Hashwert auf die Nachricht kommt.
Aber zum ausprobieren reicht etwas halbwegssicheres, das sich schnell berechnen lässt.
Halbwegs(!) sicher dürfte MD5 sein. Das erzeugt dir zwar 128 Bit, aber du könntest einfach beide 64-Bit-Hälften ver-XOR-en. Das sollte zumindest ein bisschen taugen, denke ich.
Sieh dir dazu einfach die Klasse java.security.MessageDigest an.