Java 8 предоставляет альтернативное хеширование для клавиш String для повышения производительности, когда встречается большое количество коллизий ключевых хеш-кодов. Может ли кто-нибудь объяснить, что это такое и как он будет работать?
Что такое альтернативное хеширование для клавиш String в Java 8?
Ответ 1
От это письмо [email protected]
:
- Введен новый интерфейс Hashable32.
- Hashable32 предоставляет метод hash32()
- String реализует метод Hashable32 и hash32()
- HashMap и другие распознают String и вызывают hash32(), а не hashCode()
Изменения кода:
- 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/
Ответ 2
Чтобы придать большее значение этому вопросу, альтернативное хэширование было удалено из JDK 8. Проверьте:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
Интересно отметить, что после того, как количество элементов в хэш-ведре вырастет выше определенного порога, это ведро переключится с использования связанного списка записей в сбалансированное дерево.
Функция хэша (Object key) в HashMap была пересмотрена следующим образом без специального обращения к объектам String:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Ответ 3
Следует отметить, что переход на MurmurHash3 не будет препятствовать DoS-атакам: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/