[英]Funneling in Java hashing
答案很長: 這里
簡短回答:
由於底層散列函數的錯誤,當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
都映射到,例如, thing1
。
將漏斗視為實際的漏斗:將多個輸入匯集到同一個地方。
編輯
如果哈希函數存在缺陷並且確實包含漏斗,那么最小化它們出現的方法是將表的大小設置為素數。
這是因為,就數字的“類別”(類別)而言,素數具有最少量的因子。 根據該文章,當給定鍵是表的大小的倍數或倍數時,會出現漏斗。 因此,如果我們將表格大小設置為100(不是素數),我們會提供漏斗的可能性 ,當提供的密鑰是任何因子100 :1,2,4,5,10,...,100,200時, 300等
但是,如果我們將表的大小設置為素數,比如101 ......那么漏斗的唯一可能性發生在:1,101,202,302等。我們大大降低了漏斗的可能性 。
我認為保護密鑰可以放在適當的位置哈希表,你可以看看漏斗http://burtleburtle.net/bob/hash/evahash.html#funneling
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.