У меня есть 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 ++, даже если наборы данных, используемые в наших продуктах, не годятся, почему существует разница в поведении междудва хеша ??
Спасибо большое!