在Java哈希中进行漏斗

时间:2011-12-20 18:07:21

标签: java

我读了an article which says

  

通常的做法是将素数推荐为哈希表的大小。这样,只有当密钥是素数的倍数时才会出现漏斗。

在这里,为什么素数应该用于初始大小,什么是漏斗?

2 个答案:

答案 0 :(得分:2)

答案很长:here

简短回答:
当由于底层散列函数出错而将2+个键散列到相同值时,会出现漏斗。像这样:

Map<String,Object> myMap = new HashMap<String,Object>();
Thing thing1, thing2;
thing1 = new Thing();
thing2 = new Thing();

myMap.put("ab", thing1);
myMap.put("ba", thing2);

如果HashMap<K,V>使用的散列函数存在固有缺陷,则abba键映射到{{1}时会出现“漏斗” }}

将漏斗视为实际的漏斗:多个输入将漏斗放到同一个地方。

修改
如果哈希函数存在缺陷并且包含漏斗,那么最小化它们出现的方法是将表的大小设置为素数。

这是因为,就数字的“类别”(类别)而言,素数具有最少量的因子。根据该文章,当给定键是表的大小的倍数或倍数时,会出现漏斗。因此,如果我们将表格大小设置为100(不是素数),当提供的密钥是任何因子100 时,我们会引入漏斗的可能性:1,2, 4,5,10,...,100,200,300等

但是如果我们把表的大小设置为素数,比如说101 ......那么漏斗的唯一可能性发生在:1,101,202,302等。我们大大减少了漏斗的可能性

答案 1 :(得分:0)

我认为要保护密钥以便在适当的位置放置哈希表,您可以查看漏斗http://burtleburtle.net/bob/hash/evahash.html#funneling