【发布时间】:2016-06-20 09:28:16
【问题描述】:
这是我目前所拥有的:
struct pairhash {
public:
inline std::size_t operator()(const std::pair<int, int> &c) const
{
int x = c.first;
int y = c.second;
return ((x+y)*(x+y+1)/2 + y); // Cantor's enumeration of pairs
}
};
我需要使用这个哈希函数,这样我就可以将这对整数放在一个 unordered_set 中,如下所示:
std::unordered_set< std::pair<int, int>, pairhash> mySet;
编辑:忘记从这对中获取坐标。更新了代码。 编辑:删除了模板代码 - 错误地添加了它。
编辑:根据关于 SO 的另一个类似答案更改了函数,与 Cantor 的配对枚举有关: hash function providing unique uint from an integer coordinate pair
编辑:无碰撞不是必需的(感谢 Petr)。
【问题讨论】:
-
我有一种预感,如果
size_t是int,则没有这样的功能。 -
这完全取决于您输入 w.r.t 的域。我相信您系统上
std::size_t的最大值/最小值。 -
一般来说,哈希类型中的位数需要是元素类型的位数之和才能无冲突(如果两个元素值都可以是任意位模式)。然后哈希函数可以是位的简单串联。不过,您会遇到哈希表大小的问题。
-
为什么你需要这个函数没有碰撞?
-
域是指值的范围。因此,如果您的数字很小,它应该可以正常工作。但是,一旦您的人数增加一点,结果将不适合
int或size_t。不要忘记ints 上的溢出是 UB,尤其是在开启优化的情况下。