哈希表的基本概念html
哈希表,也叫散列表,它是基於快速存取的角度設計的,是一種典型的「空間換時間」的作法。哈希表是普通數組的一種推廣,由於數組能夠直接尋址,故可在O(1)時間內訪問數組的任意元素,其中它的插入和刪除的時間複雜度也是O(1)。c++
哈希表是根據關鍵字(Key Value)而直接進行訪問的數據結構。也就是說,它將關鍵字經過某種規則映射到數組中的某個位置,以加快查找的速度。這個映射規則稱爲哈希函數(散列函數),存放記錄的數組稱爲哈希表。哈希表創建了關鍵字和存儲地址之間的一種直接映射關係。算法
若多個不一樣的關鍵字經過哈希函數計算獲得相同的數組下標,稱其發生了衝突,這些發生衝突的不一樣關鍵字稱爲同義詞。一方面,設計好的HASH函數應儘可能減小這這樣的衝突;另外一方面,因爲這樣的衝突老是不可避免的,因此還要設計好處理衝突的方法。數組
哈希函數安全
全部散列都有以下一個基本特性:若是兩個散列值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入也是不相同的(根據同一函數)。那麼這兩個散列值的原始輸入也是不相同的。這個特性使散列函數具備肯定性的結果,具備這種性質的散列函數稱爲單向散列函數。數據結構
典型的散列函數都有無限定義域,好比任意長度的字節字符串,和有限的值域,好比固定的比特串。函數
經常使用哈希函數學習
咱們在數據結構這門課程,曾經學習這幾種簡單經常使用的散列函數,如直接定址法、乘法散列法、除法散列法、除留餘數法,摺疊法等。加密
如下咱們介紹工業界比較著名的哈希函數(哈希算法),這些算法一般應用於信息安全領域)。設計
典型的哈希算法包括MD4,MD5和SHA-1,MD5和SHA-1(安全哈希算法)能夠說是目前應用最爲普遍的Hash算法,而它們都是以MD4爲基礎設計的。
處理衝突的方法
任何哈希函數都不可能絕對地避免衝突,爲此必須考慮衝突發生時應如何進行處理,即爲產生衝突的關鍵字尋找下一個「空」的Hash地址,因而提出了處理衝突的各類方法。
1) 鏈地址法
鏈地址法是指把散列在同一槽的全部元素(同義詞)都存儲在一個線性鏈表中,這個鏈表由其散列地址惟一標識。
給定一個能存放n個元素的、具備m個槽位的散列表T,定義T的裝載因子(load factor)α爲n/m,即一個鏈的平均存儲元素數。α能夠小於、等於或者大於1
2)開放定址法
開放定址法是指可存放新表項的空閒地址。既向它的同義詞表項開放,又向它的非同義詞表項開放。其數學遞推公式爲(Hi表示衝突發生後第i次探測的散列地址):
Hi=(H(key)+di)%m
式中,i=1,2,...,k(k<=m-1),m爲散列表表長,di爲增量序列,di一般有如下幾種取法:
當di=1,2,..,m-1時稱爲線性探測法。其特色是,衝突發生時順序查看錶中下一個單元,直到找出一個空單元或查遍全表。
當di=12,-12,22,-22,...,k2,-k2時,其中k<=m/2,又爲二次探測法。
當di是僞隨機序列時,稱爲僞隨機探測法。
3)再散列法
當衝突發生時,利用另外一個哈希函數再次計算一個地址,直到衝突再也不發生,這種方法稱爲再哈希法。
4)創建一個公共溢出區
一旦由哈希函數獲得的地址衝突,就都填入溢出表。
有如下兩點須要說明:
1)在開放定址的情形下,不能隨便刪除表中已有的元素,由於若刪除元素將會截斷其餘具備相同散列地址的元素的查找地址。因此若想刪除一個元素時,給它作一個刪除標記,進行邏輯刪除。但這樣作的反作用是,在執行屢次刪除後,表面上看起來散列表很滿,實際上有許多位置沒有利用,所以須要按期維護散列表,要把作刪除標記的元素物理刪除。
2)計算查找的平均查找長度ASL時,平均的概念是對錶終當前非空元素而言的,並不是是整個表長。計算查找失敗的平均查找長度ASL時,平均的概念是針對表長。
鏈地址方法和開放定址法的區別
1. 鏈地址法的節點是動態申請的,因此適用於沒法肯定建表前沒法肯定表長的狀況;鏈地址法的指針須要空間,故當結點規模較小時,開放定址法較爲節省空間
2. 拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,所以平均查找長度較短
3. 開放定址法爲減小衝突,要求裝填因子α較小,故當結點規模較大時會浪費不少空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增長的指針域可忽略不計,所以節省空間;
哈希算法是否能夠用來加密?
解答:哈希(hash)就是把任意長度的輸入經過哈希算法,變換成固定長度的輸出,該輸出就是哈希值(散列值)。這種轉換是一種壓縮映射,使得散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一肯定輸入值。哈希算法是一種消息摘要uanfa,雖然哈希算法不是一種加密算法,但因爲其單向運算,具備必定的不可逆性使其成爲加密算法中的一個重要構成部分。
一致性哈希:http://blog.codinglabs.org/articles/consistent-hashing.html
參考資料:
1. 《數據結構與算法分析c++描述》 第三版 人民郵電出版社