我希望能够在unordered_container
中使用std::pair
作为键。我知道可以按照以下方式实现:
template<typename T>
void
hash_combine(std::size_t &seed, T const &key) {
std::hash<T> hasher;
seed ^= hasher(key) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std {
template<typename T1, typename T2>
struct hash<std::pair<T1, T2>> {
std::size_t operator()(std::pair<T1, T2> const &p) const {
std::size_t seed(0);
::hash_combine(seed, p.first);
::hash_combine(seed, p.second);
return seed;
}
};
}
然而,我希望哈希算法不考虑std::pair
中元素的顺序(即对于std::pair<A, B>
和std::pair<B, A>)
返回相同的种子).
我想到的一种方法是在创建我的std::pair<A, B>
时应用某种排序(即某种自定义的std::make_pair
)。但这太过严格,因为对象A,B
可能没有任何顺序。
Q:
是否有标准的方法可以哈希一个std::pair
,使元素的顺序被忽略并且对于std::pair<A, B>
和std::pair<B, A>
返回相同的种子?
^
来组合哈希值。请参见 https://dev59.com/RG025IYBdhLWcg3wpHl_ 编辑:再想一想:这对于std::pair<A, A>
可能不是很好,因为所有具有相等值的对都将具有哈希值0
。 - Wintermutehash(first) + hash(second)
呢? - Howard Hinnant