首页 > 解决方案 > unordered_map 的自定义哈希问题

问题描述

我有一个 unordered_map,其元素由一对(字符串,枚举)索引,并带有这样的自定义哈希:

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;

由于当枚举的值为 A(乘以 0)时存在明显的冲突,所以我们用哈希器的 operator() 中的注释行更改了哈希器。

但是我们发现有时,我们的产品在两个哈希器之间的结果是不同的,而 unordered_map 应该处理冲突。每次出现差异时,都意味着我们的数据集存在问题。

但是从 c++ 的角度来看,即使我们产品中使用的数据集不好,为什么两个哈希之间存在行为差异?

非常感谢 !

标签: c++dictionaryhashunordered-map

解决方案


推荐阅读