首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地散列一对指针?

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

Stack Overflow用户
提问于 2016-09-07 12:39:18
回答 2查看 1.3K关注 0票数 0

我有一个std::unordered_map,键类型为std::pair<T*, T*> (即一对指针)。

代码库定义了以下哈希函式:

代码语言:javascript
复制
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);
  }
};

并用作:

代码语言:javascript
复制
std::unordered_map<std::pair<T*, T*>, U, pair_hash> myDictionary;

其中U是一个任意对象。

现在,上面显示的散列函子一定有某些问题,因为在VC++中,它在std::unordered_map::find中给了我一个越界崩溃。

问:

  • 是我的哈希函子有问题,还是这种行为归因于VC++本身?
  • 是否有一种“适当/更适当”的方法来散列一对指针?
EN

回答 2

Stack Overflow用户

发布于 2016-09-07 12:43:46

代码语言:javascript
复制
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中你会遇到很多碰撞。

票数 2
EN

Stack Overflow用户

发布于 2016-09-07 13:12:35

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39370214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档