Это ужасная хеш-функция. Но это законно, поэтому ваша реализация будет работать.
Правило (и действительно единственное правило) для Hash and Equals:
- если
a == b
, то std::hash<value_type>(a) == std::hash<value_type>(b)
.
(Также важно, чтобы и Hash, и Equals всегда выдавали одно и то же значение для одних и тех же аргументов. Раньше я думал, что это само собой разумеется, но я видел несколько SO вопросов, где unordered_map приводил к неожиданным результатам именно потому, что один или оба из эти функции зависят от некоторого внешнего значения.)
Это было бы удовлетворено хэш-функцией, которая всегда возвращала 42, и в этом случае карта становилась довольно медленной, когда заполнялась. Но кроме проблемы скорости, код будет работать.
std::unordered_map
использует цепочечный хеш , а не хэш с открытым адресом. Все записи с одинаковыми значениями хеш-функции помещаются в одну корзину, которая является связанным списком. Таким образом, низкокачественные хэши не очень хорошо распределяют записи между сегментами.
Понятно, что ваш хеш дает {x, y}
и {y, x}
одинаковое хеш-значение. Более серьезно, любая коллекция точек в маленьком прямоугольнике будет совместно использовать одно и то же небольшое количество различных хеш-значений, потому что старшие биты хеш-значений будут одинаковыми.