答案 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>
使用的散列函数存在固有缺陷,则ab
和ba
键映射到{{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