Проблема с пользовательским хешем с unordered_map - PullRequest
1 голос
/ 01 июля 2019

У меня есть unordered_map с элементами, проиндексированными парой (string, enum) и с пользовательским хеш-кодом, подобным этому:

enum E { A, B, C };

using my_type = std::pair<std::string, E>;

struct _my_type_hasher : std::hash<std::string>, std::unary_function < my_type, size_t >
{
    size_t operator()(const my_type& id) const
    {
        size_t r = std::hash<std::string>::operator()(id.first);
        r *= id.second;
        return r;


        //return std::hash<std::string>()(id.first) ^ std::hash<int>()(id.second);
    }
};

std::unordered_map<my_type, Bar, _my_type_hasher> m_foo;

Поскольку существует очевидное столкновение, когда значение enum равно A (умножив на 0), мы изменили хеш-код с закомментированной строкой в ​​операторе () хеш-кода.

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

Но с точки зрения c ++, даже если наборы данных, используемые в наших продуктах, не годятся, почему существует разница в поведении междудва хеша ??

Спасибо большое!

...