我建议使用 92821 。这就是为什么。
要对此给出有意义的答案,您必须了解
i和的可能值
j。我唯一能想到的是,在许多情况下,小值比大值更常见。(在程序中显示为15的几率要比438281923好得多。)因此,通过选择适当的质数来使最小的哈希码冲突尽可能大似乎是一个好主意。对于31这个很坏的-已经为
i=-1和
j=31你有相同的哈希值作为
i=0和
j=0。
由于这很有趣,因此我编写了一个小程序,在这个意义上,它在整个int范围内搜索最佳素数。也就是说,对于每个素数,我搜索与相同的哈希码的
Math.abs(i)+Math.abs(j)所有值中的最小值,然后在该最小值尽可能大的地方取素数。
i,j``0,0
Drumroll :从这个意义上说,最好的素数是486187739(最小的碰撞是
i=-25486,j=67194)。92821碰撞最小,几乎一样容易记住
i=-46272 and j=46016。
如果给“小”赋予另一个含义,并希望将其作为最小
Math.sqrt(i*i+j*j)碰撞的最大值,则结果会有所不同:最好是1322837333具有
i=-6815and j=70091,但我最喜欢的92821(最小碰撞
-46272,46016)仍然几乎一样好作为最佳价值。
我确实承认,这些计算在实践中是否有意义尚有争议。但我确实认为,除非有充分的理由,否则将92821作为质数比31更有意义。



