如何正确地散列一对指针?

时间:2016-09-07 12:39:18

标签: c++ pointers hash unordered-map std-pair

我有一个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中出现了越界崩溃。

问:

  • 可能是我的哈希函子有问题还是这个行为归因于VC ++本身?
  • 是否有一种“正确/更合适”的方式来散列一对指针?

2 个答案:

答案 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函数。