良好的哈希函数,2个整数表示特殊键

时间:2012-10-06 23:04:23

标签: c++ hash hashmap

我正在尝试确定map<double, double>类型的密钥。但问题是我想要的密钥将由一对2个数字生成。是否有任何好的函数可以为(0,1),(2,3),(4,2)(0,2)等对生成这样的键。

2 个答案:

答案 0 :(得分:6)

转到N'ary数值系统,其中N是对中数字的最大可能值。

像这样:

hash(a, b) = a + b * N

然后

a = hash(a, b) % N
b = hash(a, b) / N

这将保证每对(a,b)都有自己唯一的哈希值(a,b)。十进制数字也是如此:想象从0开始的所有数字(我们将它们写成00,01,02,...)到99包括你的对ab。然后,哈希(a,b)= a * 10 + b,反之亦然,要获得第一个数字,你必须将数字除以10,秒 - 得到模10。

为什么我们不能选择任何N,也许小于a / b的最大值?答案是:避免碰撞 如果您选择任何数字并且它恰好小于您的最大数字,则很可能由不同的数字对提供相同的哈希函数。例如,如果您为对选择N = 10:(10,10)和(11,0),它们的哈希值将等于110,这在这种情况下对您不利。

答案 1 :(得分:0)

理想情况下,您应该使用KeyValuePair<int, int>作为密钥。我不认为编写更多代码可能会有所帮助。如果由于某种原因你不能拥有它,那么对该对进行散列以给出一个键取决于你想要实现的目标。如果哈希适用于Dictionary等散列结构,则必须平衡冲突率和散列速度。要拥有完美的散列而不会发生碰撞,这将耗费更多时间。类似地,最快的散列算法将具有相对更多的冲突。找到完美的平衡是关键。 此外,您应该考虑有效散列的大小,以及散列输出是否应该是可逆的,以便返回原始输入。通常应优先考虑加速配对/散列/映射,而不是最小化冲突概率(良好的散列算法将具有较少的冲突机会)。为了拥有完美的哈希,您可以看到this thread的多种选择。