概念
Hash: 一般譯作散列、雜湊,或音譯爲哈希
常用的hash算法:
- MD4:基於32位操作系統實現。
- MD5:速度比MD4慢一點,但更安全,在抗分析和抗差分方面表現更好。
- SHA-1 :抗窮舉(brute-force)性更好,SHA-1 設計時基於和MD4相同原理,並且模仿了該算法
- 其他
散列函數
1.除留餘數法 h(K) = K%m
m>n : 素數 (散列表長度)m>n(帶散列的數據表長)
參數 | 含義 |
---|---|
K | 關鍵字 |
m | 散列表的長度 |
n | 帶散列的數據表長 |
2. 直接定址法 h(k) = k+e
這樣散列地址就是關鍵字本身,沒有衝突發生,若有衝突,則表明關鍵字錯誤。
參數 | 含義 |
---|---|
K | 關鍵字 |
e | 某個數值常量 |
解決衝突的方法
1.線性探測法
方法: 從發生衝突的地方一次查找下一個單元,直到找到一個空閒單元,或探查完所有單元爲止。
2.鏈接法
散列表中每個單元存放相應每個單鏈表的表頭結點,單鏈表的結點動態分配產生,將發生衝突的結點用單鏈表連接起來。
舉個例子
參數 | 含義 |
---|---|
ASL | 平均查找長度 |
散列存儲 散列查找
上圖案例使用散列函數爲:h(K)=K%5
參數 | 含義 |
---|---|
K: | 代查找關鍵字 |
h(K): | 散列函數 |
g: | 散列地址(宿主空間下標值) |
散列表 | 散列存儲的數組 |
舉個例子:
一個集合s={18, 75, 62},散列表 表長爲5,散列函數 h(K)=K%5;
h(18) = 18%5 = 3
h(75) = 75%5 = 0
h(62) = 62%5 = 2
若再存儲一個關鍵字 K=13,則散列地址爲 h(13) = 13%5 = 3
發現下標爲3的單元已被佔用,此時發生了衝突
同義詞: 不同關鍵字,具有相同散列地址
同義詞衝突: 兩個關鍵字的散列地址相同
衝突的影響因素
1. 裝填因子 α
α = n/m
n: 原散列表已存入的數
m: 原散列表空間大小
α 越小,空閒空間比例越大,發生衝突的可能性越小
2. 散列函數
散列函數選擇恰當會使散列地址儘可能均勻的分散到散列空間,否則會集中於某一區域,增大沖突的發生
散列函數應用
1. 錯誤矯正
2. 語音識別
3. 信息安全
- 文件校驗
- 數字簽名
- 鑑權協議
散列查找總結
優點:
插入和查找的速度相當快
缺點:
- 計算散列地址需要花費時間
- 在散列表中體現不出數據元素之間的邏輯關係
- 佔用存儲空間多
參考:
https://www.bilibili.com/video/BV1g4411H7Py
https://baike.baidu.com/item/Hash/390310