Hash算法在應用中又稱為指紋(fingerprint)或者摘要(digest)算法,是一種將任意長度的明文串映射為較短的數據串(hash值)的算法,目前的Hash算法主要是MD5系列算法與SHA系統算法
一個好的Hash算法需要具有四個特性,即正向快速 ,逆向困難,輸入敏感 ,沖突避免
正向快速 :給定明文和 Hash 算法,在有限時間和有限資源內能計算得到 Hash 值
逆向困難:給定Hash 值,在有限時間內難以逆推出明文
輸入敏感:原始輸入信息發生任何改變,新產生的 Hash 值都應該出現很大不同
沖突避免:很難找到兩段內容不同的明文,使得它們的 Hash 值一致 。沖突避免也叫做抗碰撞性,分為強抗碰撞性與弱抗碰撞性。如果給定明文前提下,無法找到與之碰撞的其他明文,則算法具有弱抗碰撞性;如果無法找到任意兩個Hash 碰撞的明文,則稱算法具有強抗碰撞性
由於Hash可以將任意內容映射到一個固定長度的字符串,而且不同內容映射到相同串的概率很低 。因此,這就構成了一個很好的“內容→索引”的生成關系。對於給定的內容與存儲數組,可以通過構造合適的Hash函數,使內容計算得出的Hash值不超過數組的大小,從而實現快速的基於內容的查找,用以判斷"某個元素是否在一個集合內"的問題。但是將映射的Hash值限制在數組大小的范圍內,會造成大量的Hash沖突,從而導致性能的急速下降,所以人們基於Hash算法設計出了布隆過濾器
布隆過濾器采用了多個 Hash 函數來提高空間利用率。 對同一個給定輸入來說,多個Hash函數計算出多個地址,分別在數組的這些地址上標記為1,進行查找時,進行同樣的計算過程,並查看對應元素,如果都為1,則說明較大概率是存在該輸入,如下圖所示,根據內容執行Hash1,Hash2,HashK等函數,計算出h1,h2,hk等位置,如果這些位置全部是1,則說明abc@gmail.com有很大概率存在
之所以說有很大概率,是因為不管是單一的Hash算法還是布隆過濾器,其思想是一致的,都是基於內容的編碼,但是由於存儲限制,都可能存在沖突,即兩種方法都可能存在誤報的問題,同時都不會存在錯報的問題。不過在應用中布隆過濾器的誤報率遠低於單一Hash算法的誤報率