我有一个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中给了我一个越界崩溃。
问:
发布于 2016-09-07 12:43:46
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中你会遇到很多碰撞。
发布于 2016-09-07 13:12:35
如果您可以使用Boost,您可以使用一个非常有用的hash_combine函数。
https://stackoverflow.com/questions/39370214
复制相似问题