2012-08-14 12 views
10

Java 8 dostarcza alternatywnego skrótu dla kluczy String w celu zwiększenia wydajności, gdy napotkana zostanie duża liczba kolizji kluczy. Czy ktoś może wyjaśnić, co to jest i jak to będzie działać?Co to jest alternatywne hashing dla kluczy String w Java 8?

+1

+1 ten może być wykorzystywany w celu uniknięcia ataków typu DoS. –

+0

Dziękuję, że będę o tym pamiętać –

+0

@PeterLawrey Czy odnosisz się do [tego zgłoszenia błędu] (https://bugzilla.redhat.com/show_bug.cgi?id=750533) lub czegoś innego, kiedy wspominasz DoS? –

Odpowiedz

7

Od this email z [email protected]:

  • Nowa Hashable32 interfejs jest wprowadzony.
  • Hashable32 dostarcza hash32() w
  • ciąg realizuje sposób Hashable32 i hash32()
  • HashMap wsp rozpoznać ciąg i wywołać hash32() niż hashCode()

się przeglądy kod:

+0

Z tego, co wiem, największe wady starego algorytmu hashowania polegały na tym, że czasami zwracano zero w przypadku długich łańcuchów, a określenie konkretnej implementacji wykluczało możliwość wykorzystania maszyny wirtualnej do funkcji "hash-string", która została zaprojektowana dla optymalna wydajność na tej konkretnej maszynie (np. 64-bitowa maszyna może korzystać z funkcji działającej w grupach po 8 bajtów, a następnie munges wynik w dół do 32 bitów). Zastanawiam się, ile kodu naprawdę zależy od dokładnych wartości starego hasha łańcucha i jak ciężko byłoby pozwolić na "obejście zgodności"? – supercat

6

Aby przynieść większe znaczenie na to pytanie alternatywne hashing został usunięty z JDK 8. Sprawdź:

http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html

http://openjdk.java.net/jeps/180

Warto zwrócić uwagę, że gdy liczba elementów w wiaderku mieszania wzrasta powyżej pewnego progu, że wiadro będzie przełączyć się z połączonej listy wpisów do zrównoważonego drzewa.

Hasz (klawisz Object) funkcja w HashMap został zmieniony na następujący bez specjalnego traktowania obiektów String:

static final int hash(Object key) { 
    int h; 
    return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16); 
}