如何正确散列一对指针
How to properly hash a pair of pointers?
我有一个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
函数
相关文章:
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 存储函数指针的正确语法
- 从 Rcpp 函数返回指向"新"对象的指针的正确方法
- 在C++中有多个指向单个对象的指针的正确方法是什么?
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 对于指向C++类的不透明C指针,正确的typedef是什么
- 递增空指针无法正确设置值
- 用非零值初始化void指针的正确(或最安全)方法
- 何时/如何在使用指针后正确删除指针?
- 引用计数智能指针的正确实现
- 从类成员返回智能指针的正确方法?
- 指针未正确返回值
- 在崩溃时释放分配的指针的正确方法
- 删除间接指针是否正确
- 如何保证当模板类成员是指针时正确释放模板类成员
- 通过基类指针调用正确的模板函数
- 用于"context"指针的正确类型
- (C )当在同一类中调用时,污点指针返回正确的值,而从MAIN调用时为0
- 我明白为什么,但是虚拟函数/VTable 究竟如何允许通过指针访问正确的函数?
- BST 节点删除 - 指针未正确删除