В java 8 java.util.Hashmap я заметил изменение из:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
to:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
Из кода видно, что новая функция является более простой XOR
младших 16 бит с верхним 16, оставляя верхние 16 битов без изменений, в отличие от нескольких разных сдвигов в предыдущей реализации, и из комментариев, которые это менее эффективно при распределении результатов хеш-функций с большим количеством коллизий в младших битах в разные ковши, но экономит циклы процессора, делая меньше операций.
Единственное, что я видел в примечаниях к выпуску, - это изменение из связанных списков в сбалансированные деревья для хранения сталкивающихся ключей (которые, как я думал, могли изменить время имеет смысл потратить на расчет хорошего хэша), меня особенно интересовало, было ли какое-либо ожидаемое влияние производительности на это изменение на больших хэш-картах. Есть ли какая-либо информация об этом изменении, или кто-либо, кто лучше знает хэш-функции, имеет представление о том, каковы могут быть последствия этого изменения (если они есть, возможно, я просто неправильно понял код), и если возникла необходимость генерировать хэш коды по-другому поддерживают работу при переходе на Java 8?