如何正确散列一对指针

How to properly hash a pair of pointers?

本文关键字:指针 何正确      更新时间:2023-10-16

我有一个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);
  }
};

And用作:

std::unordered_map<std::pair<T*, T*>, U, pair_hash> myDictionary;

其中U为任意对象。

现在上面显示的哈希函子一定有一定的问题,因为在vc++中它给了我一个越界崩溃在std::unordered_map::find

问:

  • 可能是我的哈希函子有问题,或者这种行为归因于vc++本身?
  • 是否有"适当/更适当"的方式来散列一对指针?
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)

你的函数对每一对指针都返回0。因此,你在unordered_map中得到了很多碰撞。

如果您可以使用Boost,那么您可以使用一个非常有用的hash_combine函数