Хеш-функция для создания универсальной хеш-таблицы в Java (в целях обучения)

1

Если вы создавали общую хеш-таблицу в Java (предположим, что ее еще не было), то как бы вы реализовали хэш-функцию по умолчанию? Я знаю, что вы можете передать один (через интерфейс), но большинство структур данных имеют значения по умолчанию.

Моя попытка:

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

Есть лучший способ сделать это?

  • 0
    Определись лучше . Существует много способов реализации хеш-таблицы (открытая адресация, объединение в цепочку, виды блоков и т. Д.), И существует несколько видов данных и их распределение, которые могут привести к различным требованиям к функциям хеширования.
  • 0
    Интересно ... Почему реализация имеет значение; открытая адресация или цепочка, меньше коллизий все еще более эффективно, верно?
Показать ещё 2 комментария
Теги:
data-structures
hash
hashtable

1 ответ

1
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню