布隆過濾器有exists方法通過對位陣列的hash計算判斷某元素是否在集合中,實現去重功能。但布隆過濾器有一下缺點:
不支援反向刪除元素:一旦對位陣列進行了賦值,無法將其刪除。
查詢效能弱:布隆過濾器使用多個hash函式計算位圖多個不同位點,由於多個位點在記憶體中不連續,cpu定址花銷較大。
空間利用率低。
布穀鳥過濾器源於布穀鳥hash演算法,布穀鳥hash表有兩張,分別兩個hash函式,當有新的資料插入的時候,它會計算出這個資料在兩張表中對應的兩個位置,這個資料一定會被存在這兩個位置之一(表1或表2)。一旦發現其中一張表的位置被佔,就將改位置原來的資料踢出,被踢出的資料就去另一張表找對應的位置。通過不斷的踢出資料,最終所有資料都找到了自己的歸宿。
但仍會有資料不斷的踢出,最終形成迴圈,總有乙個資料一直沒辦法找到落腳的位置,這代表布穀hash錶走到了極限,需要將hash演算法優化或hash表擴容。
布穀鳥過濾器只會儲存元素的指紋資訊(幾個bit,類似於布隆過濾器),由於不是儲存了資料的全部資訊,會有誤判的可能。
由於布穀鳥過濾器在踢出資料時,需要再次計算原資料在另一種表的hash值,因此作者設計hash演算法時將兩個hash函式變成了乙個hash函式,第一張表的備選位置是hash(x),第二張表的備選位置是hash(x)⊕hash(fingerprint(x)),即第一張表的位置與儲存的指紋的hash值做異或運算。這樣可以直接用指紋的值 異或 原來位置的hash值來計算出其另一張表的位置。
布穀鳥過濾器在錯誤率小於3%的時候空間效能是優於布隆過濾器的,而這個條件在實際應用中常常滿足,所以一般來說它的空間效能是要優於布隆過濾器的。布穀鳥過濾器按照普通設計,只有兩個hash表,在查詢的時候可以確保兩次訪存就可以做完,相比於布隆過濾器的k個hash函式k次訪存,在資料量很大不能全部裝載在記憶體中的情況下,多次訪問記憶體效能較差。當然,布穀過濾器也有其相應的缺點,當裝填資料過多的時候,容易出現迴圈的問題,即插入失敗的情況。另外,它還跟布隆過濾器共有的乙個缺點,就是訪問空間位址不連續,記憶體定址消耗大。
綜上,布穀鳥過濾器優點:
訪問記憶體次數低
hash函式計算簡單
缺點:記憶體空間不聯絡,cpu消耗大
容易出現裝填迴圈問題
刪除資料時,hash衝突會引起誤刪
布穀鳥過濾器**:cuckoo filter: practically better than bloom
redis 布穀鳥過濾器模組: github.com/kristoff-it…
redis快取穿透 布隆過濾器和布穀鳥過濾器
快取穿透就是查詢一次不存在的資料,因為不存在,所以也不會往redis裡寫值,這樣一直查不存在的資料就會導致一直查資料庫,redis並沒有起到作用。解決這個可以讓redis快取乙個空值或者快取乙個特殊的字串,但如果別人故意每次用不同的不存在的值惡意攻擊的話,即使快取了空值也還是沒有,這就可以用布隆過濾...
布穀鳥雜湊的學習筆記1
布穀鳥雜湊介面 public inte ce hashfamily布穀鳥雜湊的類的框架 public class cuckoohashtable public cuckoohashtable hashfamily hashfunctions,int size private void allocat...
Vue 過濾器案例(全域性過濾器和區域性過濾器)
doctype html en utf 8 viewport content width device width,initial scale 1.0 js vue 2.4.0 js script 過濾器 title head 兩個過濾器的名稱都為msgformat,但是控制不同作用,乙個是全域性的...