Рассмотрим набор ключей и хеш-таблицу, где количество сегментов равно . Поскольку коэффициент равен , ключи, кратные будут хэшироваться в сегменты, кратные :K={0,1,...,100}m=1231233
- Ключи будут хэшированы в сегмент .{0,12,24,36,...}0
- Ключи будут хэшированы в сегмент .{3,15,27,39,...}3
- Ключи будут хэшированы в корзину .{6,18,30,42,...}6
- Ключи будут хэшированы в корзину .{9,21,33,45,...}9
Если распределен равномерно (т. Е. Каждый ключ в одинаково вероятен), то выбор не так критичен. Но что произойдет, если распределено неравномерно? Представьте, что ключи, которые чаще всего встречаются, кратны . В этом случае все сегменты, которые не кратны будут пустыми с высокой вероятностью (что действительно плохо с точки зрения производительности хеш-таблицы).KKmK33
Такая ситуация встречается чаще, чем может показаться. Представьте, например, что вы отслеживаете объекты в зависимости от того, где они хранятся в памяти. Если размер слова вашего компьютера составляет четыре байта, то вы будете хэшировать ключи, кратные . Само собой разумеется, что выбор как кратного был бы ужасным выбором: у вас было бы ведра полностью пустыми, и все ваши ключи сталкивались в оставшихся ведрах.4m43m/4m/4
В общем:
Каждый ключ в который имеет общий множитель с числом сегментов будет хэширован в сегмент, кратный этому коэффициенту.Km
Поэтому, чтобы свести к минимуму столкновений, важно , чтобы уменьшить количество общих факторов между и элементами . Как этого достичь? Выбирая для числа, у которого очень мало факторов: простое число .mKm