BloomFilte布隆過濾器簡介

一、簡介

布隆過濾器(BloomFilter)是一種比較巧妙的概率型數據結構(probabilistic data structure),它是1970年由布隆提出的一種空間空間效率很高的隨機數據結構。它利用位數組很簡潔地表示一個集合,並判斷一個元素是否屬於這個集合。一個空的布隆過濾器有長度爲M比特的bit數組構成,且所有位都初始化0。一個元素通過K個不同的hash函數隨機散列到bit數組的K個位置上,K必須遠小於M。K和M的大小由錯誤率(falsepositiverate)決定。布隆過濾器能夠準確判斷一個元素不在集合內,但只能判斷一個元素可能在集合內。
布隆過濾器存儲空間和插入/查詢時間都是常數,可以高效地插入和查詢。另外, Hash 函數相互之間沒有關係,方便由硬件並行實現。布隆過濾器不需要存儲元素本身,在某些對保密要求非常嚴格的場合有優勢。布隆過濾器特點是,可以用來確認“某樣東西一定不存在或者可能存在”。相比於傳統的 List、Set、Map 等數據結構,它更高效、佔用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。
Google 著名的分佈式數據庫 Bigtable 使用了布隆過濾器來查找不存在的行或列,以減少磁盤查找的IO次數。Squid 網頁代理緩存服務器在 cache digests 中使用了也布隆過濾器。在很多Key-Value系統中也使用了布隆過濾器來加快查詢過程,如 Hbase,Accumulo,Leveldb,一般而言,Value 保存在磁盤中,訪問磁盤需要花費大量時間,然而使用布隆過濾器可以快速判斷某個Key對應的Value是否存在,因此可以避免很多不必要的磁盤IO操作,只是引入布隆過濾器會帶來一定的內存消耗。

二、布隆過濾器相關要素的關係

當向一個集合S中添加元素x使用布隆過濾器進行過濾時,x經過k個散列函數後,在M中得到k個位置,然後,將這k個位置的值設置爲1。如果要判斷x元素是否在集合S中:x經過k個散列函數後得到k個位置的值,如果這k個值中間存在爲0的,說明元素x不在集合中。如果M中的k個位置全爲1,則有可能這個元素在這個集合中,也有可能是其他一個或多個元素插入的時候將這k個位置的值置爲1了。
如果要在應用中使用布隆過濾器,則要考慮如下要素:
 布隆過濾器的長度該設置爲多少;
 該設計多少個散列函數,每個散列函數怎麼設計;
 允許的散列結果完全重複率是多少。
假設要處理的數據集合的個數是n,散列函數的個數是k,散列結果重複率爲p,布隆過濾器數組的位數爲m。則最優位數m和最優函數個數k的計算公式如下:

上述公式的推導過程請參考《詳解布隆過濾器的原理,使用場景和注意事項》。

從上述公式可知,只要處理數據的集合數量確認和重複率確認,即可以獲得過濾器的數組位數和散列函數的個數。除了設置合適的k和m值外,每個散列函數也必須仔細設計。首先是所有散列函數必須相互獨立,沒有任何關係,其次是函數輸出的值範圍足夠寬,要儘可能降低輸出值的衝突。

跟老猿學Python、學5G!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章