bloom-filter演算法 其實可以看作 bit-map 的一種擴充套件。
它把已存在的元素通過多個hash 函式對映到乙個 bit 序列,對於每乙個元素根據hash函式的結果把相應的 位置置一(這個bit序列通常很長,但是比起記住所有元素它占用的空間是小的)。
在判斷乙個元素時候已存在的時候,它會把這個元素的多個hash結果對應到bit序列中檢視,如果已經全部置為一,那麼說明該元素已經存在。
乙個bloom filter有以下引數:
mbit陣列的寬度(bit數)
n加入其中的key的數量
k使用的hash函式的個數
ffalse positive的比率
(假陽性)
為了把錯誤率控制在 f,共有 n 個元素的集合作 bloom filter 其他引數可以由以下公式來定值:
m =nlg(1/f)*lge (其中
lg 表示以2為底的對數)
k = - ln(f) /
ln(2)
另外對於乙個元素非常多的集合要進行
bloom
filter操作,必須構造乙個返回值範圍很大的 hash 函式。可以用 md5 演算法生成十六進製制的hash值,然後轉成十進位制:
import hashlibm=hashlib.md5()
m.update('123123123123123123')
print int(m.hexdigest(), base=16)
詳見:
Bloom Filter演算法優化
基於redis的bloom filter去重,利用redis的string資料結構,但redis的string最大只能512m,所以資料過大的時候,需要申請多個去重塊。bloom filter對乙個很長的字串進行雜湊對映時會出錯,常誤判為已經存在,所以我們進行一次壓縮 md5 sha1 將去重佇列和...
Bloom Filter 布隆演算法
日常生活中,包括在設計計算機軟體時,我們經常要判斷乙個元素是否在乙個集合中。比如在字處理軟體中,需要檢查乙個英語單詞是否拼寫正確 也就是要判斷它是否在已知的字典中 在 fbi,乙個嫌疑人的名字是否已經在嫌疑名單上 在網路爬蟲裡,乙個 是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計算機中,...
例項學習Bloom Filter
0.科普 1.為什麼需要bloom filter 2.基本原理 3.如何設計bloom filter 4.例項操作 5.擴充套件 0.科普 bloom filter是由bloom在1970年提出的一種多雜湊函式對映的快速查詢演算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求10...