Для того, чтобы это имело какой-либо смысл, его необходимо объединить с пониманием того, как HashMap распределяет вещи по сегментам.Это тривиальная функция, с помощью которой выбирается индекс сегмента:
static int indexFor(int h, int length) {
return h & (length-1);
}
Итак, вы можете видеть, что при размере таблицы по умолчанию, равном 16, на самом деле только 4 младших значащих бита хеша действительно имеют значение для выделения сегментов!(16 - 1 = 15, что маскирует хеш на 1111b)
Это может быть плохой новостью, если ваша функция hashCode вернула:
10101100110101010101111010111111
01111100010111011001111010111111
11000000010100000001111010111111
//etc etc etc
Такая хеш-функция вряд ли будет "плохо "любым способом, который виден его автору.Но если вы объедините это с тем, как карта распределяет сегменты, boom, MapFail (tm).
Если вы помните, что h - это 32-битное число, это не magic числасовсем.Он систематически записывает наиболее значимые биты числа вправо в младшие значащие биты.Цель состоит в том, чтобы «различия» в количестве, встречающемся где-либо «поперек», при просмотре в двоичном виде стали видны вниз в младших значащих битах.
Столкновения становятся ограниченными, поскольку число различных чисел, имеющих одинаковыесоответствующие LSB теперь значительно ограничены, потому что любые различия, которые встречаются где-либо в двоичном представлении, сжаты в биты, которые важны для сегментирования.