布隆過濾器誤判怎麼辦為什麼會 到底什麼是布隆演算法?

2021-10-14 09:58:09 字數 1805 閱讀 1033

大家應該都或多或少的有過爬蟲經驗吧,面對海量的url,我們該怎麼去重?我們知道bitmap是很好的演算法,但是它對字串可不友好哦。有人說,hashset不行嗎?利用hashset的key唯一性,把所有的url當做key,可以是可以,但是如果一次爬取的資料量很大的時候,例如1億,每個url的長度為20個位元組,那麼hashset占用的記憶體空間為1.8g,顯然是不可取的。

嗯??使用bitmap存入每個url的hashcode()如何?可以是可以,當時別忘記hash碰撞哦,如何解決hash碰撞便成為一大痛點,有一定概率造成url誤殺哦。

或許你可能想通過對同一url多次取hashcode降低碰撞的概率,但很遺憾,hash碰撞的概率隨著物件增加也是飆公升的,有人計算過hash碰撞概率的公式:k^2/2n,看下圖:

這是乙個 n=2^32的圖,它說明了使用32bit的hash值的衝突概率,當hash數是77163時,發生碰撞的可能為50%,這是有價值的。而且注意無論n區任意值都會得到乙個類似s曲線的圖。

既然這樣,多次hashcode這個方法依然存在很大機率的誤殺,尤其資料量很大的時候。

那麼,該怎麼辦呢?

布隆過濾器採用了3中不同的hash演算法,每個對應的url生成3個不同的hash值,分別儲存在bitmap不同的位置,每次存入bitmap時,先根據生成的3個hash值檢查對應下標的值是否都為1,都為1,則重複,否則不重複。

具體流程如下:

1.建立乙個空的bitmap集合

2.把第乙個url按照三種hash演算法,分別生成三個不同的hash值。

3.分別判斷5,17, 9 在bitmap的對應位置是否為1,只要不同時為1,就認為該url沒有重複,於是把5,17,9的對應位置設定為1。

4.把第二個url按照三種hash演算法,分別生成三個不同的hash值。

5.分別判斷10,12, 9 在bitmap的對應位置是否為1,只要不同時為1,就認為該url沒有重複,於是把10,12, 9 的對應位置設定為1。

那麼,問題來了,假設某乙個url經過3次hash計算,結果為10,12,17,該怎麼辦?

此時如下:

1.url按照三個hash演算法得到三個結果。

2.分別判斷10,12, 17 在bitmap的對應位置是否為1。判斷的結果是 10,12, 17 在bitmap對應位置的值都是1,所以判定該url是乙個重複的url。這就是誤判。

布隆過濾器為了解決這種問題,一般擴大bitmap的size,單個url產生更多的hash值(一般8次),但並不會完全避免誤判。布隆過濾器只能在空間和準確性上做出取捨,嚴格意義上講,布隆過濾器只是一種思想,談不真正意義上的演算法。

布隆過濾器

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

布隆過濾器

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

布隆過濾器

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