1231 и 1237 - это только два (достаточно большие) произвольные простые числа .Подойдут любые два больших числа.
Почему простые числа? Предположим на секунду, что мы выбрали составные числа (не простые числа), скажем, 1000 и 2000. При вставке логических значений в хеш-таблицу true и false попадут в корзину 1000 % N
соответственно 2000 % N
(где N
- количество ведер).
Теперь обратите внимание, что
1000 % 8
такое же ведро, что и 2000 % 8
1000 % 10
то же ведро, что и 2000 % 10
1000 % 20
то же ведро, что и 2000 % 20
- ....
, другими словами, это приведет к много коллизий .
Это потому, что факторизация 1000 (2 3 , 5 3 ) и факторизация 2000 (2 4 , 5 3 ) имеют так много общих факторов.Таким образом, простые числа выбираются, поскольку они вряд ли будут иметь какие-либо общие факторы с размером сегмента.
Почему большие простые числа.Разве 2 и 3 не сделали бы? При вычислении хеш-кодов для составных объектов обычно добавляют хеш-коды для компонентов.Если в хэш-наборе с большим количеством сегментов используются слишком малые значения, существует риск того, что в результате получится неравномерное распределение объектов.
Имеют ли значение коллизии?В любом случае логические значения имеют два разных значения? Карты могут содержать логические значения вместе с другими объектами.Кроме того, как отметил Drunix, распространенный способ создания хеш-функций составных объектов заключается в повторном использовании реализаций хеш-кода подкомпонентов, и в этом случае полезно возвращать большие простые числа.
Вопросы, связанные с данной: