Ответ 1
Dunno 'об английском языке, но вот какой-то код и образец вывода:
public static void main ( String[] args ) {
int h = 0xffffffff;
int h1 = h >>> 20;
int h2 = h >>> 12;
int h3 = h1 ^ h2;
int h4 = h ^ h3;
int h5 = h4 >>> 7;
int h6 = h4 >>> 4;
int h7 = h5 ^ h6;
int h8 = h4 ^ h7;
printBin ( h );
printBin ( h1 );
printBin ( h2 );
printBin ( h3 );
printBin ( h4 );
printBin ( h5 );
printBin ( h6 );
printBin ( h7 );
printBin ( h8 );
}
static void printBin ( int h ) {
System.out.println ( String.format ( "%32s",
Integer.toBinaryString ( h ) ).replace ( ' ', '0' ) );
}
Какие принты:
11111111111111111111111111111111
00000000000000000000111111111111
00000000000011111111111111111111
00000000000011111111000000000000
11111111111100000000111111111111
00000001111111111110000000011111
00001111111111110000000011111111
00001110000000001110000011100000
11110001111100001110111100011111
Итак, код разбивает хеш-функцию на шаги, чтобы вы могли видеть, что происходит. Первый сдвиг 20 позиций xor со вторым сдвигом 12 позиций создает маску, которая может перевернуть 0 или более из нижних 20 бит int. Таким образом, вы можете получить некоторую случайность, вставленную в нижние биты, которая использует потенциально более распределенные более высокие бит. Затем он применяется через xor к исходному значению, чтобы добавить эту случайность к младшим битам. Второй сдвиг в 7 позициях x или сдвиг 4 позиций создает маску, которая может перевернуть 0 или более нижних 28 бит, что снова приводит к некоторой случайности к младшим битам и к некоторым из более значительных, используя капитализацию предыдущего xor которые уже рассматривали некоторые из распределений в младших битах. Конечным результатом является более плавное распределение бит через хэш-значение.
Так как hashmap в java вычисляет индекс bucket, комбинируя хэш с количеством ведер, вам нужно иметь равномерное распределение младших бит хеш-значения, чтобы равномерно распределять записи в каждом ковше.
Что касается доказательства утверждения о том, что это ограничивает количество столкновений, то у меня нет ввода. Кроме того, см. здесь за хорошую информацию о создании хеш-функций и несколько подробностей о том, почему xor двух чисел стремится к случайному распределению бит в результате.