TransWikia.com

Реализация Boolean.hashCode()

Stack Overflow на русском Asked by EvgeniiVolkov on August 30, 2021

Почему метод Boolean.hashCode(boolean value) возвращает значения 1231, если параметр равен true, и 1237, если параметр равен false? В чем смысл именно этих значений?

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

One Answer

1231 и 1237 это просто произвольные простые числа (причем достаточно большие).

Почему именно простые?

Предположим, что для вычисления хэш-кода true мы используем не 1231 (простое число), а 1000 (составное число). Также и для значения false: вместо 1237 (простое число) взяли 2000 (составное число). Допустим у нас есть хэш-таблица, в которой количество bucket’ов равно N. Тогда bucket в который попадет наш объект Boolean вычислется по формуле: hashCode % N, т.е. Boolean(true) попадет в bucket 1000 % N, а Boolean(false) в bucket 2000 % N.

Ну и что?

Если мы внимательно посмотрим на остатки от деления, то обнаружим, что использование составных чисел влечет за собой множество коллизий. Например:

  • Остаток от деления 1000 % 8 такой же как и у 2000 % 8
  • Остаток от деления 1000 % 10 такой же как и у 2000 % 10
  • Остаток от деления 1000 % 20 такой же как и у 2000 % 20

Таким образом, для вычисления хэш-кодов выбираются простые числа. При их использовании будет минимальное количество коллизий, в чилу того что у них нет общих делителей.

Почему именно большие простые числа? Чем 2 и 3 не устраивают?

При вычислении хеш-кодов для составных объектов обычно используют хеш-коды входящих в объект компонентов. При этом если, у нас получается маленькое по величине значение хэш-кода, то при большом количестве buсket’ов растет вероятность неравномерного распределения объектов по хэш-таблице.

По материалам: Boolean.hashCode()

PS. Спасибо first-sin за наводку

Correct answer by EvgeniiVolkov on August 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP