Подтвердить что ты не робот

Почему Object # hashCode() возвращает int вместо long

почему бы и нет:

public native long hashCode();

вместо:

public native int hashCode();

для более высокой вероятности достижения уникальных хеш-кодов?

4b9b3361

Ответ 1

Потому что максимальная длина массива Integer.MAX_VALUE.

Поскольку простое использование hashCode() заключается в том, чтобы определить, какой слот вставить объект в массив подстановки HashMap/Hashtable, хэш-код > Integer.MAX_VALUE не сможет быть сохранен в массив.

Ответ 2

В любом случае значение хэш-кода будет использоваться для определения числа строк в таблице, которая является относительно небольшим значением.

В HashMap, например, таблица по умолчанию содержит 256 строк всего 16 строк (Sun JDK 1.6.0_17). Это означает, что номер строки определяется следующим образом:

int rowNumber = obj.hashCode() % rowsCount;

Итак, реальное распределение от 0 до rowsCount.

UPD. Я помню реализацию ConcurrentHashMap. Вкратце, ConcurrentHashMap содержит множество относительно небольших таблиц. Сначала функция hashCode используется для определения номера таблицы, и после этого одна и та же функция используется для определения строки в выбранной таблице.

Этот подход устраняет ограничение размера массива (и даже позволяет создавать распределенную хеш-таблицу).

Итак, я склоняюсь к выводу, что hashCode возвращает int, потому что он охватывает подавляющее большинство случаев использования.

Ответ 3

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

например - если вы создаете небольшой хеш с 10 или 100 или 1000 значениями, разница в количестве столкновений хэша, которые вы увидите, будет крайне незначительна. Для более крупных хэшей... ну, подумайте, как большой хэш должен быть для 10 ** 32 значений, чтобы начать иметь частые столкновения, и возможно ли это сделать в JVM, учитывая объем памяти, который вам нужен.