布隆過濾器

使用場景

布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu)汹忠,旨在快速秉版、高效地判斷一個元素是否存在于一個集合中坐榆。

優(yōu)缺點

優(yōu)點當(dāng)然是時間復(fù)雜度很低.但他也有缺點础废,布隆過濾器是一個概率數(shù)據(jù)結(jié)構(gòu)
它告訴我們拗馒,該元素要么肯定不在集合中(not_in)路星,要么可能(maybe_in)在集合中。(會告訴你maybe_in的概率.)

原理&實踐

布隆過濾器的基本數(shù)據(jù)結(jié)構(gòu)是一個比特數(shù)組诱桂。下面是一個demo數(shù)組洋丐,我們將用來演示。

image.png

該表中的每個空單元代表一個bit挥等,下面的數(shù)字則是其索引Index友绝。要向布隆過濾器添加一個元素,我們只需對其進(jìn)行幾次hash肝劲,并將這些hash結(jié)果所在的索引處的比特置為1迁客。

例如,我們把集合["yanxin","yanxiaori","yanbo"], 通過Fnv和Murmur計算后, 把結(jié)果添加到布隆數(shù)組中
(Fnv和Murmur是兩個簡單的哈希函數(shù)。)

image.png

當(dāng)你添加一個字符串時辞槐,你可以
image

看到哈希值給出的索引處的比特被設(shè)置為1掷漱。我用綠色來顯示新添加的,但任何彩色單元都只是1榄檬。

image.png

為了測試成員資格卜范,你只需用相同的哈希函數(shù)對字符串進(jìn)行哈希,然后看這些值是否在比特向量中被設(shè)置鹿榜。如果不是海雪,你就知道這個元素不在這個集合中。如果它們是舱殿,你只知道它可能是奥裸,因為另一個元素或其他元素的一些組合可能設(shè)置了相同的位。再一次怀薛,我們來演示一下刺彩。

image.png

以上就是布隆過濾器的基本概念.

高級

在我寫更多關(guān)于布魯姆過濾器的內(nèi)容之前,先聲明一下:我從來沒有在生產(chǎn)中使用過它們枝恋。請不要相信我的話创倔。我所要做的只是給你一個大致的概念,并指出你可以在哪里找到更多焚碌。

在下面的文字中畦攘,我們將提到一個有k個哈希值的布隆過濾器,過濾器中的m個比特十电,以及被插入的n個元素知押。

哈希函數(shù)

布隆過濾器中使用的哈希函數(shù)應(yīng)該是獨立的叹螟、均勻分布的。它們還應(yīng)該是盡可能快的(像sha1這樣的加密散列函數(shù)台盯,雖然被廣泛使用罢绽,但并不是很好的選擇)。

足夠獨立的快速静盅、簡單的哈希值的例子包括murmur良价、fnv系列的哈希值和HashMix。

要看到比加密哈希函數(shù)更快的區(qū)別蒿叠,請看這個故事明垢,當(dāng)把一個bloom filter的實現(xiàn)從md5切換到murmur時,速度提高了大約800%市咽。

在一個簡短的布隆過濾器實現(xiàn)的調(diào)查中痊银。

Chromium使用HashMix。(另外施绎,這里有一個關(guān)于他們?nèi)绾问褂胋loom filter的簡短描述)
python-bloomfilter使用加密的哈希值
Plan9使用Mitzenmacher 2005中提出的簡單哈希值
Sdroege Bloom filter使用fnv1a(包括在內(nèi)只是因為我想展示一個使用fnv的溯革。)
Squid使用MD5

布隆過濾器的時間和空間復(fù)雜度如何?

給定一個有m個比特和k個散列函數(shù)的布隆過濾器粘姜,插入和成員測試都是O(k)鬓照。
也就是說,每次你想向集合添加一個元素或檢查集合成員資格時孤紧,你只需要通過k個散列函數(shù)運行該元素豺裆,并將其添加到集合中或檢查這些比特。

空間方面的優(yōu)勢更難總結(jié)号显;這同樣取決于你愿意容忍的錯誤率臭猜。這也取決于要插入的元素的潛在范圍:
如果它非常有限,一個確定性的比特向量可以做得更好押蚤。如果你甚至不能粗略估計要插入的元素的數(shù)量蔑歌,你可能最好使用哈希表或可擴展的布魯姆過濾器4。

參考

https://llimllib.github.io/bloomfilter-tutorial/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揽碘,一起剝皮案震驚了整個濱河市次屠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雳刺,老刑警劉巖劫灶,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掖桦,居然都是意外死亡本昏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門枪汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涌穆,“玉大人怔昨,你說我怎么就攤上這事∷尴。” “怎么了趁舀?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祝沸。 經(jīng)常有香客問我赫编,道長,這世上最難降的妖魔是什么奋隶? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮悦荒,結(jié)果婚禮上唯欣,老公的妹妹穿的比我還像新娘。我一直安慰自己搬味,他們只是感情好境氢,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碰纬,像睡著了一般萍聊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悦析,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天寿桨,我揣著相機與錄音,去河邊找鬼强戴。 笑死亭螟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骑歹。 我是一名探鬼主播预烙,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼道媚!你這毒婦竟也來了扁掸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤最域,失蹤者是張志新(化名)和其女友劉穎谴分,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羡宙,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狸剃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狗热。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞馁。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡虑省,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出僧凰,到底是詐尸還是另有隱情探颈,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布训措,位于F島的核電站伪节,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绩鸣。R本人自食惡果不足惜怀大,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呀闻。 院中可真熱鬧化借,春花似錦、人聲如沸捡多。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒手。三九已至蒜焊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間科贬,已是汗流浹背泳梆。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榜掌,地道東北人鸭丛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像唐责,于是被迫代替她去往敵國和親鳞溉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容