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?
Odpowiedz
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:
- Murmur3: https://code.google.com/p/smhasher/wiki/MurmurHash3
- althashing "7" webrev : http://cr.openjdk.java.net/~mduigou/althashing7/8/webrev/
- althashing "8" webrev: http://cr.openjdk.java.net/~mduigou/althashing8/8/webrev/
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
Należy zauważyć, że przejście do MurmurHash3 nie zapobiega atakom DoS: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/
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);
}
+1 ten może być wykorzystywany w celu uniknięcia ataków typu DoS. –
Dziękuję, że będę o tym pamiętać –
@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? –