Erstellen eines Hashs aus mehreren Java-String-Objekten

8

Was wäre die schnellste und robustere (in Bezug auf Eindeutigkeit) Art und Weise, eine Methode wie

zu implementieren %Vor%

Das values[] -Array hat 100 bis 1.000 Mitglieder, jedes mit einigen Dutzend Zeichen, und die Methode muss jedes Mal ca. 10.000 mal / s in einem anderen values[] -Array ausgeführt werden.

Soll eine lange Zeichenfolge mit einem StringBuilder -Puffer erstellt und dann eine Hash-Methode für den Pufferinhalt aufgerufen werden, oder ist es besser, die Hash-Methode für jede Zeichenfolge aus values[] ?

aufzurufen?

Offensichtlich wird ein Hash von mindestens 64 Bits benötigt (z. B. MD5), um Kollisionen zu vermeiden, aber gibt es etwas einfacheres und schnelleres, das bei derselben Qualität durchgeführt werden könnte?

Zum Beispiel, was ist mit

? %Vor%     
PNS 14.05.2012, 16:38
quelle

4 Antworten

9

Verwenden Sie aufgrund seiner Linearitätseigenschaften definitiv keine einfache Addition, aber Sie können Ihren Code nur geringfügig ändern, um eine sehr gute Dispersion zu erreichen.

%Vor%     
Marko Topolnik 14.05.2012 16:43
quelle
4

Es bietet keinen 64-Bit-Hash, aber angesichts des Titels der Frage ist es wahrscheinlich erwähnenswert, dass es seit Java 1.7 java.util.Objects # hash (Objekt ...) .

    
Oliver Coleman 03.03.2017 23:14
quelle
2

Sie sollten beim Kombinieren von Methoden auf Schwachstellen achten. (Die Java-Hash-Funktion und Ihre eigenen). Ich habe ein wenig über kaskadierte Chiffren geforscht, und das ist ein Beispiel dafür. (Die Addition könnte die Interna von hashCode () stören.

Die Interna von hashCode () sehen so aus:

%Vor%

Das Hinzufügen von Zahlen führt dazu, dass die letzten Zeichen aller Zeichenfolgen im Array einfach hinzugefügt werden, was die Zufälligkeit nicht verringert (dies ist bereits schlimm genug für eine Hash-Funktion).

Wenn Sie echte Pseudozufälligkeit wünschen, sehen Sie sich den Hash-Algorithmus FNV an. Es ist der schnellste Hash-Algorithmus, der speziell für HashMaps entwickelt wurde.

Es geht so:

%Vor%

^ Dies ist nicht die tatsächliche Implementierung von FNV, da es als Eingabe anstelle von Bytes verwendet wird, aber ich denke, es funktioniert genauso gut.

    
Mark Jeronimus 14.05.2012 16:54
quelle
1

Erstens ist der Hash-Code typischerweise numerisch, z. %Code%. Darüber hinaus erstellt Ihre Version der Hash-Funktion int und macht dann ihre String-Darstellung, dass IMHO keinen Sinn hat.

Ich würde Ihre Hash-Methode wie folgt verbessern:

%Vor%

Schauen Sie sich int in der Klasse hashCode()

an     
AlexR 14.05.2012 16:46
quelle

Tags und Links