布隆过滤器原理
布隆過濾器是一種概率型數據結構,特點是高效地插入和查詢,可以用來告訴你 “某樣東西一定不存在或者可能存在”.
相比于傳統的 List、Set、Map 等數據結構,布隆過濾器是一個bit數組, 它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。
如果我們要映射一個值到布隆過濾器中,我們需要使用多個不同的哈希函數生成多個哈希值,并對每個生成的哈希值指向的 bit 位置 1,例如針對值 “zhangsan” 和三個不同的哈希函數分別生成了哈希值 1、4、7
我們現在再存一個值 “lisi”,如果哈希函數返回 4、5、8 的話,圖繼續變為:
當我們想要判斷布隆過濾器是否記錄了某個數據時,布隆過濾器會先對該數據進行同樣的哈希處理, 比如 “wangwu”的哈希函數返回了 2、5、8三個值,結果我們發現 2 這個 bit 位上的值為 0,說明沒有任何一個值映射到這個 bit 位上,因此我們可以很確定地說 “wangwu” 這個數據不存在。
但是同時我們會發現,4 這個 bit 位由于”zhangsan”和”lisi”的哈希函數都返回了這個 bit 位,因此它被覆蓋了。那么隨著布隆過濾器保存的數據不斷增多, 重復的概率就會不斷增大, 所以當我們過濾某個數據時, 如果發現其三個哈希值都在過濾器中進行了記錄, 那么也只能說明過濾器中可能包含了該數據, 并不能絕對肯定, 因為可能是其他數據的哈希值對結果產生了影響.這也就解釋了上文所說的 布隆過濾器只能說明“某樣東西一定不存在或者可能存在”.至于為什么采用三種不同的哈希函數取值, 因為三個哈希值只要有一個不存在就說明數據一定不在過濾器中, 這樣做是可以減小因哈希碰撞(兩個數據的哈希值相同)產生的錯誤概率.
總結
- 上一篇: 数据库和缓存的双写一致性问题
- 下一篇: Redis学习笔记--Redis数据过期