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;
}
1231 и 1237 это просто произвольные простые числа (причем достаточно большие).
Почему именно простые?
Предположим, что для вычисления хэш-кода true мы используем не 1231 (простое число), а 1000 (составное число). Также и для значения false: вместо 1237 (простое число) взяли 2000 (составное число). Допустим у нас есть хэш-таблица, в которой количество bucket’ов равно N. Тогда bucket в который попадет наш объект Boolean вычислется по формуле: hashCode % N, т.е. Boolean(true) попадет в bucket 1000 % N, а Boolean(false) в bucket 2000 % N.
Ну и что?
Если мы внимательно посмотрим на остатки от деления, то обнаружим, что использование составных чисел влечет за собой множество коллизий. Например:
Таким образом, для вычисления хэш-кодов выбираются простые числа. При их использовании будет минимальное количество коллизий, в чилу того что у них нет общих делителей.
Почему именно большие простые числа? Чем 2 и 3 не устраивают?
При вычислении хеш-кодов для составных объектов обычно используют хеш-коды входящих в объект компонентов. При этом если, у нас получается маленькое по величине значение хэш-кода, то при большом количестве buсket’ов растет вероятность неравномерного распределения объектов по хэш-таблице.
По материалам: Boolean.hashCode()
PS. Спасибо first-sin за наводку
Correct answer by EvgeniiVolkov on August 30, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP