计算地图结构的哈希

时间:2019-05-16 05:51:55

标签: c++ c++11 stl unordered-map

我想整体计算unordered_map数据结构的哈希值。这样就可以轻松比较两个map,无论它们是否包含完全相同的键值对。

很明显,人们可以遍历所包含的对,然后构建一个长字符串并对其进行哈希处理,但是我可以想象有更好的方法可以做到这一点。

目前,实际的哈希函数并不是那么关键。我认为md5可以。 sha当然也是。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您将需要一个交换组合函数,boost::hash_combine 不是故意的,因此具有不同内部顺序的相等unordered_map具有相同的散列。为此,我建议对每个元素的哈希值进行异或运算。

template<typename UnorderedMap>
std::size_t hash(const UnorderedMap & um)
{
    boost::hash<typename UnorderedMap::value_type> elem_hash;
    auto combine = [&](size_t acc, typename UnorderedMap::const_reference elem){ return acc ^ elem_hash(elem); };
    return std::accumulate(um.begin(), um.end(), 0, combine);
}

答案 1 :(得分:1)

您可以尝试使用boost的hash_combine()来合并每个条目的哈希。如果您不想使用boost,则可以对各个散列值进行异或运算,最终得到合并的散列值。

此外,您还可以通过以下答案来说明如何在不使用哈希组合的情况下比较2个地图:

Link to answer