Страницы

Поиск по вопросам

понедельник, 9 марта 2020 г.

Шаблонная хэш-функция

#cpp #хеширование


Допустим, мне нужно сделать некий шаблонный контейнер Map на хэш-таблице. Контейнер,
естественно, может принимать ключем значение любых типов  - как, в таком случае, написать
хэш-функцию? Как привести произвольный тип T (для которого может быть не перегружен
оператор приведения) к целочисленному типу? 
Вроде как должен помочь reinterpret_cast, который приводит к указателю, но конструкция вида

reinterpret_cast  (key);


Отказывается компилироваться, когда key имеет не-целочисленный тип.

Если же приводить указатель к указателю (как в примере на msdn)

reinterpret_cast  (&key);


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

Можно ли как-то насильно интерпретировать байты произвольного объекта в памяти как
целочисленный тип?
Вообще, какое решение будет правильным? Как эта проблема решена в std::unordered_map
или QMap?
    


Ответы

Ответ 1



Классы наподобие unordered_set вычисляют хеш не сами, а используют std::hash (а также дают возможность пользователю указать свою реализацию хеширования, если он недоволен стандартной, или если её не существует). std::hash, в свою очередь, тоже не пользуется никакой особой магией, а просто имеет шаблонные специализации для примитивных типов, строк и указателей (обычных и «умных»). Мне кажется, вам стоит не изобретать велосипед, а воспользоваться той же идеей. А ещё проще, просто используйте std::hash. Поверьте, в написании контейнера есть много сложностей помимо этой. Таким образом, просто используйте size_t hash_value = std::hash()(t);

Комментариев нет:

Отправить комментарий