Answers:
1231和1237只是两个(足够大)任意质数。任何其他两个大质数都可以。
为什么要灌注?
假设一秒钟,我们挑选合数(非素数),说1000年和2000年当插入到布尔哈希表,真和假会进入斗1000 % N
RESP 2000 % N
(这里N
是桶的数量)。
现在注意
1000 % 8
与同一桶 2000 % 8
1000 % 10
与同一桶 2000 % 10
1000 % 20
与同一桶 2000 % 20
换句话说,它将导致许多碰撞。
这是因为1000的分解(2 3,5 3)和2000年的因式分解(2 4,5 3)有这么多的共同因素。因此选择质数,因为它们与存储桶大小不太可能具有任何共同的因素。
为什么大素数。2和3不会吗?
在计算复合对象的哈希码时,通常会为组件添加哈希码。如果在具有大量存储桶的哈希集中使用的值太小,则存在对象分布不均的风险。
碰撞重要吗?布尔值到底有两个不同的值吗?
映射可以包含布尔值以及其他对象。同样,正如Drunix所指出的,创建复合对象的哈希函数的一种常见方法是重用子组件哈希代码的实现,在这种情况下,返回大素数是很好的。
相关问题:
2*1231 = 2462
存储桶。在这种情况下碰撞会成为问题吗?