2013-02-01 10 views
5

Was ist der beste Weg, Hash-Code basierend auf den Werten dieser Zeichenfolge in einem Durchgang zu berechnen?Wie berechnet man einen guten Hash-Code für eine riesige Liste von Strings?

Mit gut meine ich, dass es sein muss:

1 - schnell: Ich brauche Hash-Code für riesige Liste zu bekommen (10^3..10^8 Titel) von kurzen Strings.

2 - identifizieren die gesamte Liste der Daten so viel Liste mit vielleicht nur paar verschiedenen Strings müssen verschiedene Hash-Codes haben

Wie es in Java zu tun?

Vielleicht gibt es eine Möglichkeit, vorhandenen String-Hash-Code zu verwenden, aber wie viele Hash-Codes für separate Strings zusammengeführt werden?

Vielen Dank.

+2

Was ist "gut"? –

+1

Wofür soll der Hashcode verwendet werden? Willst du nur einen Hash oder einen für jeden String? –

+0

Willst du ** Hash Code ** Werte wie Java hat bereits 'hashCode()' Methode auf String, die einen int zurückgibt, oder wollen Sie Hash-Werte wie MD5 Digest? –

Antwort

8

Erstellen Sie eine Platzhalter-Klasse für Ihre Zeichenfolgen und verwenden Sie dann CRC32 class. seine einfach und schnell:

import java.util.zip.CRC32; 

public class HugeStringCollection { 
    private Collection<String> strings; 

    public HugeStringCollection(Collection<String> strings) { 
     this.strings = strings; 
    } 

    public int hashCode() { 
     CRC32 crc = new CRC32(); 
     for(String string : strings) { 
      crc.update(string.getBytes()) 
     } 

     return (int)(crc.getValue()); 
    } 
} 

, wenn die Sammlung selbst unveränderlich ist, können Sie den Hash einmal berechnen und speichern sie für lates wiederzuverwenden.

+0

CRC klingt schnell, wie gut ist es bei der Darstellung der Daten? – Bohdan

+0

ist es seit Jahren in der Dateiverarbeitung weit verbreitet, z.B. in ZIP-Komprimierung – mantrid

+0

@mantrid Wie konvertiert man dies für eine Arraylist von Characters? wie ich denke, wir haben nicht getBytes für Charakter !? –

Verwandte Themen