布隆過濾器

2021-10-24 18:42:31 字數 1173 閱讀 4157

假設你現在要處理這樣乙個問題,你有乙個**並且擁有很多訪客,每當有使用者訪問時,你想知道這個ip是不是第一次訪問你的**。

乙個顯而易見的答案是將所有的ip用hashtable存起來,每次訪問都去hashtable中取,然後判斷即可。但是題目說了**有很多訪客, 假如有10億個使用者訪問過,每個ip的長度是4 byte,那麼你一共需要4 * 1000000000 = 4000000000bytes = 4g , 如果是判斷url黑名單, 由於每個url會更長,那麼需要的空間可能會遠遠大於你的期望。

另乙個稍微難想到的解法是bit, 我們知道bit有0和1兩種狀態,那麼用來表示存在,不存在再合適不過了。

加入有10億個ip,我們就可以用10億個bit來儲存,那麼你一共需要 1 * 1000000000 = (4000000000 / 8) bytes = 128m, 變為原來的1/32, 如果是儲存url這種更長的字串,效率會更高。

基於這種想法,我們只需要兩個操作,set(ip) 和 has(ip)

這樣做有兩個非常致命的缺點:

當樣本分佈極度不均勻的時候,會造成很大空間上的浪費

我們可以通過雜湊函式來解決

當元素不是整型(比如url)的時候,bitset就不適用了

我們還是可以使用雜湊函式來解決, 甚至可以多hash幾次

布隆過濾器其實就是bit + 多個雜湊函式, 如果經過多次雜湊的值再bit上都為1,那麼可能存在(可能有衝突)。 如果 有乙個不為1,那麼一定不存在(乙個值經過雜湊函式得到的值一定是唯一的),這也是布隆過濾器的乙個重要特點。

網路爬蟲 判斷某個url是否已經被爬取過

k-v資料庫 判斷某個key是否存在

比如hbase的每個region中都包含乙個bloomfilter,用於在查詢時快速判斷某個key在該region中是否存在。

釣魚**識別

瀏覽器有時候會警告使用者,訪問的**很可能是釣魚**,用的就是這種技術

從這個演算法大家可以對 tradeoff(取捨) 有更入的理解。

布隆過濾器

布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...

布隆過濾器

布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...

布隆過濾器

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...