哈希(hash)也翻譯做散列。Hash算法,是將一個不定長的輸入,經過散列函數變換成一個定長的輸出,即散列值。python
這種散列變換是一種單向運算,具備不可逆性即不能根據散列值還原出輸入信息,所以嚴格意義上講Hash算法是一種消息摘要算法,不是一種加密算法。常見的hash算法有:SM三、MD五、SHA-1等 。算法
Hash主要應用在數據結構以及密碼學領域。數據庫
在不一樣的應用場景下,hash函數的選擇也會有所側重。好比在管理數據結構時,主要要考慮運算的快速性,而且要保證hash均勻分佈;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不一樣明文hash值相同的狀況發生。數組
在密碼學中,Hash算法的做用主要是用於消息摘要和簽名,換句話說,它主要用於對整個消息的完整性進行校驗。好比一些登錄網站並不會直接明文存儲用戶密碼,存儲的是通過hash處理的密碼的摘要(hash值),當用戶登陸時只須要對比輸入明文的摘要與數據庫存儲的摘要是否相同;即便黑客入侵或者維護人員訪問數據庫也沒法獲取用戶的密碼明文,大大提升了安全性。安全
使用Hash算法的數據結構叫作哈希表,也叫散列表,主要是爲了提升查詢的效率。它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數就是hash函數,存放記錄的數組叫作哈希表。在數據結構中應用時,有時須要較高的運算速度而弱化考慮抗碰撞性,可使用本身構建的哈希函數。數據結構
自定義哈希函數一般可利用除留餘數、移位、循環哈希、平方取中等方法。下面這個例子就是我本身定義的一個哈希函數,運用了取模運算和異或運算。函數
# coding:utf-8 # 自定義哈希函數 def my_hash(x): return (x % 7) ^ 2 print(my_hash(1)) # 輸出結果:3 print(my_hash(2)) # 輸出結果:0 print(my_hash(3)) # 輸出結果:1 print(my_hash(4)) # 輸出結果:6
在python中有內置的哈希函數hash(),返回一個對象(數字、字符串,不能直接用於 list、set、dictionary)的哈希值。示例代碼以下:網站
# coding:utf-8 # hash() print(hash(1)) print(hash(1.0)) # 相同的數值,不一樣類型,哈希值是同樣的 print(hash("abc")) print(hash("hello world"))
在運行時發現了一個現象:相同字符串在同一次運行時的哈希值是相同的,可是不一樣次運行的哈希值不一樣。這是因爲Python的字符串hash算法有一個啓動時隨機生成secret prefix/suffix的機制,存在隨機化現象:對同一個字符串輸入,不一樣解釋器進程獲得的hash結果可能不一樣。所以當須要作可重現可跨進程保持一致性的hash,須要用到hashlib模塊。加密
hashlib提供了常見的摘要算法,如MD5,SHA1等等。示例代碼以下:翻譯
# coding:utf-8 # 使用hashlib模塊 import hashlib md5 = hashlib.md5() # 應用MD5算法 data = "hello world" md5.update(data.encode('utf-8')) print(md5.hexdigest())