Если вы создавали общую хеш-таблицу в Java (предположим, что ее еще не было), то как бы вы реализовали хэш-функцию по умолчанию? Я знаю, что вы можете передать один (через интерфейс), но большинство структур данных имеют значения по умолчанию.
Моя попытка:
Поскольку Java-дженерикам нужны ссылочные типы, а все ссылочные типы в Java реализуют hashCode(), я решил, что вы можете просто использовать T.hashCode() % backingArraySize
в качестве хэш-функции, и этого будет достаточно. В конце концов, разработчик любого типа, который вы можете сохранить в хеш-таблице, должен дать свой тип соответствующей функции hashCode(), правильно?
Есть лучший способ сделать это?
В моей реализации hashCode() % backingArraySize
я решил использовать простой hashCode() % backingArraySize
(т. hashCode() % backingArraySize
Ваше предложение), когда алгоритм не является объектом первичной кластеризации и hashCode() * 2654435761
(константа взята из этого ответа), когда это так, т.е. для реализации линейного хеширования. Причина заключается в том, что многие по умолчанию hashCode()
- int
String
List
hashCode()
реализации не распространять значения через полный int
колодце диапазон (все Numberic штучной типы, String
, List
), и когда ключи каким - то предвзятым линейное хеширование может страдать от первичной кластеризации.