2012-02-16 10 views
5

Mam aplet Java, w którym chcę wygenerować identyfikatory long dla ciągów (w celu przechowywania tych ciągów w neo4j). Aby uniknąć duplikowania danych, chciałbym wygenerować identyfikator dla każdego ciągu zapisanego w liczbie całkowitej long, która powinna być unikalna dla każdego ciągu. Jak mogę to zrobić ?Jak mogę wygenerować długi skrót łańcucha?

+0

Nie możesz po prostu uzyskać skrótu z ciągów i rzucić je na długo przed przechowywanie w neo? – Marthin

+5

Nie można osiągnąć "unikatowego dla wszystkich ciągów" - długie ma 64 bity, ciąg o długości 9 ma 72 bity, muszą istnieć pewne łańcuchy, które będą mieszane do tego samego długiego – amit

+1

Nie można uzyskać wyjątkowości, ponieważ istnieją nieskończenie wiele strun i tylko skończenie wiele długich. Czy możesz dokładniej opisać, czego szukasz? – templatetypedef

Odpowiedz

4

long ma 64 bity. A String o długości 9 ma 72 bity. od pigeon hole principle - nie można uzyskać unikalnego skrótu dla 9 znaków długich łańcuchów do long.

Jeśli nadal chcesz long hash: Można po prostu wziąć dwa standardowe [różne!] Funkcje skrótu dla String->int, hash1() i hash2() i obliczyć: hash(s) = 2^32* hash1(s) + hash2(s)

6

Dlaczego nie rzucić okiem funkcji hashcode() String, a po prostu przyjąć go do używania długich wartości zamiast?

Przy okazji. gdyby istniał sposób na stworzenie unikalnego identyfikatora dla każdego Łańcucha, to znalazłbyś algorytm kompresji, który byłby w stanie spakować każdy Ciąg na 8 bajtów (nie jest to możliwe z definicji).

1

Istnieje wiele odpowiedzi, spróbuj wykonać następujące czynności:

Albo, jak sugerował wcześniej, sprawdź źródła.

PS. Jeszcze jedną techniką jest utrzymywanie słownika ciągów znaków: ponieważ mało prawdopodobne jest, że otrzymasz w przyszłości 2 ciągi, możesz mieć doskonałe odwzorowanie. Należy jednak pamiętać, że mapowanie może również stać się poważnym wąskim gardłem.

5

Ten kod obliczy całkiem dobry hash:

String s = "some string"; 
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits(); 
Powiązane problemy