d-Left Counting Bloom Filter (4)

根據前面的描述,d-left counting bloom filter構造過程中的缺陷有三個條件:1. xyfingerprint相同;2. 位置選擇有重合;3. x不選擇重合位置,y選擇重合位置。其中fingerprint相同我們無法避免,因爲碰撞總會出現,cell中的counter也是爲此而設置的。元素選不選擇重合位置我們也無法控制,因爲這要根據當時的負載情況而定。所以我們想要彌補這個缺陷,只能從位置重合入手。換句話說,要想辦法讓不同元素的d個位置選擇完全沒有重合(不考慮碰撞)。

 

 

我們給出的解決方案是:將hashing的整個操作分成兩個階段。第一階段,我們用一個哈希函數H計算要插入元素xhash value,記做fx;第二階段,爲了獲得d個存儲位置,我們另外引入d個隨機置換(random permutation)。令H(x) = fx = (b, r),其中bbucket index,表示存儲位置;rremainder,表示要存儲的fingerprint。然後令d個置換爲:

P1(fx) = (b1, r1), P2(fx) = (b2, r2), … , Pd(fx) = (bd, rd).

其中Pi(fx)對應着x在第i個子表的存儲位置和fingerprint。我們知道置換意味着一一對應,因此不同元素(的hash value作置換之後的值仍然不同。這樣我們就達到了前面提到的讓不同元素的d個位置選擇完全沒有重合的目標。

 

引入隨機置換避免了位置重合之後,我們還需要在插入元素之前作一項工作。每次插入一個元素時,先要在它的d個位置選擇中檢查是否已經存有相同的fingerprint,如果有,就把相應cellcounter1。由於不同元素的存儲位置不會重合,因此只有在碰撞的情況下才會出現兩個相同fingerprint能存入同一組存儲位置的情況。而我們一旦在插入之前作了檢測,再作刪除操作時就永遠不會發現d個位置中有兩個完全相同的fingerprint

 

到此爲止,刪除元素時的缺陷問題已經完全被解決了。但同時,我們也看到,爲了解決缺陷而引入的隨機置換讓存儲的過程變成了一種並不嚴格的d-left hashing。幸運的是,這個問題並不是很嚴重,至少在實現中很難看出什麼差別。至於選擇什麼樣的置換,論文作者給出的建議是:簡單的線性函數。如果哈希函數的取值範圍爲[2q],隨機置換可以寫成:

Pi(H(x)) = aH(x) mod 2q

其中a是區間[2q]中的隨機奇數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章