Boolean.hashCode () - PullRequest
       20

Boolean.hashCode ()

112 голосов
/ 12 октября 2010

Метод hashCode () класса Boolean реализован следующим образом:

public int hashCode() {
    return value ? 1231 : 1237;
}

Почему он использует 1231 и 1237? Почему не что-то еще?

Ответы [ 2 ]

134 голосов
/ 12 октября 2010

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, распространенный способ создания хеш-функций составных объектов заключается в повторном использовании реализаций хеш-кода подкомпонентов, и в этом случае полезно возвращать большие простые числа.

Вопросы, связанные с данной:

0 голосов
/ 21 февраля 2019

В дополнение ко всему сказанному выше, это может быть также маленькое пасхальное яйцо от разработчиков:

true: 1231 => 1 + 2 + 3 + 1 = 7

7 - счастливое число в европейских традициях;

false: 1237 => 1 + 2 + 3 + 7 = 13

13 (он же дюжина) - невезучий номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...