почему бы и нет:
public native long hashCode();
вместо:
public native int hashCode();
для более высокой вероятности достижения уникальных хеш-кодов?
почему бы и нет:
public native long hashCode();
вместо:
public native int hashCode();
для более высокой вероятности достижения уникальных хеш-кодов?
Потому что максимальная длина массива Integer.MAX_VALUE
.
Поскольку простое использование hashCode()
заключается в том, чтобы определить, какой слот вставить объект в массив подстановки HashMap
/Hashtable
, хэш-код > Integer.MAX_VALUE
не сможет быть сохранен в массив.
В любом случае значение хэш-кода будет использоваться для определения числа строк в таблице, которая является относительно небольшим значением.
В HashMap
, например, таблица по умолчанию содержит 256 строк всего 16 строк (Sun JDK 1.6.0_17). Это означает, что номер строки определяется следующим образом:
int rowNumber = obj.hashCode() % rowsCount;
Итак, реальное распределение от 0 до rowsCount
.
UPD. Я помню реализацию ConcurrentHashMap
. Вкратце, ConcurrentHashMap
содержит множество относительно небольших таблиц. Сначала функция hashCode
используется для определения номера таблицы, и после этого одна и та же функция используется для определения строки в выбранной таблице.
Этот подход устраняет ограничение размера массива (и даже позволяет создавать распределенную хеш-таблицу).
Итак, я склоняюсь к выводу, что hashCode
возвращает int
, потому что он охватывает подавляющее большинство случаев использования.
Я бы предположил, что это баланс стоимости вычислений и хэш-диапазона. Hashcodes так часто ссылаются на то, что в два раза больше данных каждый раз, когда вам нужен хеш, будет дорого, особенно если вы рассматриваете более распространенные случаи использования -
например - если вы создаете небольшой хеш с 10 или 100 или 1000 значениями, разница в количестве столкновений хэша, которые вы увидите, будет крайне незначительна. Для более крупных хэшей... ну, подумайте, как большой хэш должен быть для 10 ** 32 значений, чтобы начать иметь частые столкновения, и возможно ли это сделать в JVM, учитывая объем памяти, который вам нужен.