我有一个std::unordered_map
,其密钥类型为std::pair<T*, T*>
(即一对指针)。
代码库定义了以下哈希函子:
struct pair_hash {
template<typename T>
std::size_t operator()(std::pair<T, T> const &p) {
return (std::hash<T>()(p.first) + 0x9e3779b9) ^ (std::hash<T>()(p.second) + 0x9e3779b9);
}
};
用作:
std::unordered_map<std::pair<T*, T*>, U, pair_hash> myDictionary;
其中U
是任意对象。
现在上面显示的哈希算子必须有一定的问题,因为在VC ++中它让我在std::unordered_map::find
中出现了越界崩溃。
答案 0 :(得分:3)
return (std::hash<T>()(p.first) + 0x9e3779b9) ^ (std::hash<T>()(p.first) + 0x9e3779b9);
// ^^^^^
// p.second!
// ^^^^^^^^^^
// Choose different magic constant to prevent collisions between (p1, p2) and (p2, p1)
你的函数为每对指针返回零。因此,您在unordered_map
中遇到了很多冲突。
答案 1 :(得分:1)
如果你可以使用Boost,那么你可以使用一个非常有用的hash_combine
函数。