簡體   English   中英

在Java哈希中進行漏斗

[英]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>使用的散列函數存在固有缺陷,則可能會出現“漏斗”,其中鍵abba都映射到,例如, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM