1. 程式人生 > >Bloom Filter 布隆過濾器

Bloom Filter 布隆過濾器

布隆過濾器在很多場合能發揮很好的效果,比如:網頁URL的去重,垃圾郵件的判別,集合重複元素的判別,查詢加速(比如基於key-value的儲存系統)等,下面舉幾個例子:
  • 有兩個URL集合A,B,每個集合中大約有1億個URL,每個URL佔64位元組,有1G的記憶體,如何找出兩個集合中重複的URL。

很顯然,直接利用Hash表會超出記憶體限制的範圍。這裡給出兩種思路:

      第一種:如果不允許一定的錯誤率的話,只有用分治的思想去解決,將A,B兩個集合中的URL分別存到若干個檔案中{f1,f2...fk}和{g1,g2....gk}中,然後取f1和g1的內容讀入記憶體,將f1的內容儲存到hash_map當中,然後再取g1中的url,若有相同的url,則寫入到檔案中,然後直到g1的內容讀取完畢,再取g2...gk。然後再取f2的內容讀入記憶體。。。依次類推,知道找出所有的重複url。

      第二種:如果允許一定錯誤率的話,則可以用布隆過濾器的思想。

  • 在進行網頁爬蟲時,其中有一個很重要的過程是重複URL的判別,如果將所有的url存入到資料庫中,當資料庫中URL的數

量很多時,在判重時會造成效率低下,此時常見的一種做法就是利用布隆過濾器,還有一種方法是利用berkeley db來儲存url,Berkeley db是一種基於key-value儲存的非關係資料庫引擎,能夠大大提高url判重的效率。

      布隆過濾器主要運用在過濾惡意網址用的,將所有的惡意網址建立在一個布隆過濾器上,然後對使用者的訪問的網址進行檢測,如果在惡意網址中那麼就通知使用者。這樣的話,我們還可以對一些常出現判斷錯誤的網址設定一個白名單,然後對出現判斷存在的網址再和白名單中的網址進行匹配,如果在白名單中,那麼就放行。當然這個白名單不能太大,也不會太大,布隆過濾器錯誤的概率是很小的。