Я читаю код класса HashMap, предоставляемый API Java 1.6, и не могу полностью понять необходимость следующей операции (найденной в теле методов put и get):
int hash = hash(key.hashCode());
где метод hash()
имеет следующее тело:
private static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Это эффективно пересчитывает хэш, выполняя операции бит на поставляемом хэш-коде. Я не могу понять, что нужно делать, даже если API заявляет следующее:
Это критический потому что HashMap использует хэш-таблицы с длиной в две строки, что в противном случае возникают столкновения для хэш-кодов, которые не отличаются в младших битах.
Я понимаю, что пар ключей значения хранится в массиве структур данных и что расположение индекса элемента в этом массиве определяется его хешем. Я не понимаю, как эта функция добавит какое-либо значение в хэш-распределение.