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

Che*_* Li 4 c++ hash hashmap

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

dre*_*zor 6

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

像这样:

hash(a, b) = a + b * N
Run Code Online (Sandbox Code Playgroud)

然后

a = hash(a, b) % N
b = hash(a, b) / N
Run Code Online (Sandbox Code Playgroud)

这将保证每对(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,这在这种情况下对您不利.