2013-02-01 10 views
5

Jaki jest najlepszy sposób obliczania kodu skrótu na podstawie wartości tego ciągu w jednym przebiegu?Jak obliczyć dobry kod skrótu dla ogromnej listy ciągów?

Z dobrym To znaczy, że musi być:

1 - szybki: Muszę dostać kod skrótu dla ogromnej listy (10^3..10^8 pozycji) krótkich łańcuchów.

2 - zidentyfikować całą listę danych, więc wielu z listy może jedynie kilka różnych ciągów muszą mieć różne kody hash

Jak to zrobić w Java?

Być może istnieje sposób użycia istniejącego kodu skrótu, ale jak scalić wiele kodów skrótu obliczonych dla oddzielnych ciągów?

Dziękuję.

+2

Co to jest "dobry"? –

+1

Do czego służy kod skrótu? Czy potrzebujesz tylko jednego hasha, lub jednego dla każdego ciągu? –

+0

Czy chcesz ** wartości mieszania ** wartości takie jak java ma już metoda 'hashCode()' na ciąg, który zwraca int lub, czy chcesz wartości mieszania, takie jak MD5 digest? –

Odpowiedz

8

utwórz klasę zastępczą dla ciebie, a następnie użyj CRC32 class. jego prosty i szybki:

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()); 
    } 
} 

jeśli sama kolekcja jest niezmienna, można obliczyć hash raz i przechowywać go do Lates ponownego użycia.

+0

crc brzmi szybko, jak dobrze reprezentuje dane? – Bohdan

+0

jest szeroko stosowany w przetwarzaniu plików od lat, np. w kompresji ZIP – mantrid

+0

@ Mantrid, w jaki sposób przekonwertować to do pracy na tablicy listy postaci? jak myślę, że nie mamy getBytes dla postaci !? –

Powiązane problemy