d-Left Counting Bloom Filter (1)

哈希函數的輸出值(hash value)通常有兩種用途:一種用作地址,比如在哈希表中要存儲一個元素,首先要針對這個元素生成一個隨機地址;另一種用作fingerprint(或者叫digital summary),比如將密碼字符串hash成一個fingerprint,驗證時進行覈對。今天我要介紹的這種存儲信息的方式將以上兩種用途結合了起來:一個hash value分作兩部分,一部分用作存儲地址,另一部分用作fingerprint。
 
你也許會問,這樣有什麼好處嗎?當然有。上篇文章中提到了一種基於perfect hashing的方法,它用了兩步存儲每個元素的fingerprint。第一步用了一個(perfect)哈希函數生成了這個元素的存儲地址,第二步用了另一個哈希函數生成這個元素的fingerprint,然後將fingerprint存儲到第一步生成的地址中。由此可見,如果一個hash value能夠完成兩步工作,就省去了一半的工作量。
 
另外,我們要存儲的其實是集合中每個元素的fingerprint,一個哈希函數生成很大的一個hash value會讓碰撞的機率很小,從而讓false positive的概率變小。通過將這個很大的hash value中的一部分信息用作地址,其實相當於把fingerprint壓縮了:信息一點沒少,存儲位置本身就包含了一部分信息。
 
現在我們使用一個哈希函數,將它的hash value分作兩部分,高位部分用作隨機地址,低位部分留作fingerprint。如果我們用這一個哈希函數存儲一個集合,會有什麼問題?在基於perfect hashing的方法中,第一步用的哈希函數是perfect hash function,也就是說一個集合的n個元素會映射到n個bucket中,沒有碰撞。由於perfect hash function不能應對變動的集合,並且對大多數應用來說開銷太大,所以上述所說的一個哈希函數並不是perfect hash function。由此可知碰撞會產生,並且各個bucket的負載並不均衡,實際上單個哈希函數hash value的分佈服從泊松(Poisson)分佈。
 
說到這裏,文章還沒有提到d-Left Counting Bloom Filter,其實上面描述的也就是它的構造過程。我們從一個hash value同時用作地址和fingerprint出發,試圖構造一個簡潔的存儲方式來存儲一個集合的fingerprints,現在遇到了一個問題,就是負載不均衡。d-Left Counting Bloom Filter中的d-Left指的是d-Left hashing,解決的就是負載均衡問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章