簡要的說,可哈希的數據類型,即不可變的數據結構(字符串str、元組tuple、對象集objects)。python
它是一個將大致量數據轉化爲很小數據的過程,甚至能夠僅僅是一個數字,以便咱們能夠用在固定的時間複雜度下查詢它,因此,哈希對高效的算法和數據結構很重要。算法
同理,不可哈希的數據類型,便可變的數據結構 (字典dict,列表list,集合set)。數據庫
hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。返回對象的哈希值。數組
哈希(hash)也翻譯做散列。Hash算法,是將一個不定長的輸入,經過散列函數變換成一個定長的輸出,即散列值。
這種散列變換是一種單向運算,具備不可逆性即不能根據散列值還原出輸入信息,所以嚴格意義上講Hash算法是一種消息摘要算法,不是一種加密算法。常見的hash算法有:SM三、MD五、SHA-1等 。安全
Hash主要應用在數據結構以及密碼學領域。
在不一樣的應用場景下,hash函數的選擇也會有所側重。好比在管理數據結構時,主要要考慮運算的快速性,而且要保證hash均勻分佈;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不一樣明文hash值相同的狀況發生。數據結構
在密碼學中,Hash算法的做用主要是用於消息摘要和簽名,換句話說,它主要用於對整個消息的完整性進行校驗。好比一些登錄網站並不會直接明文存儲用戶密碼,存儲的是通過hash處理的密碼的摘要(hash值),當用戶登陸時只須要對比輸入明文的摘要與數據庫存儲的摘要是否相同;即便黑客入侵或者維護人員訪問數據庫也沒法獲取用戶的密碼明文,大大提升了安全性。函數
使用Hash算法的數據結構叫作哈希表,也叫散列表,主要是爲了提升查詢的效率。它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數就是hash函數,存放記錄的數組叫作哈希表。在數據結構中應用時,有時須要較高的運算速度而弱化考慮抗碰撞性,能夠使用本身構建的哈希函數。網站
>>> n = hash(1) >>> n 1 >>> n = hash(1.0) >>> n 1
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> m = hash('Vivian') >>> m -2338955002766744599 # 第一次哈希值 >>> exit() C:\Users\Administrator>python Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> m = hash('Vivian') >>> m 2113605006884176523 # 第二次哈希值
這是因爲Python的字符串hash算法有一個啓動時隨機生成secret prefix/suffix的機制,存在隨機化現象:對同一個字符串輸入,不一樣解釋器進程獲得的hash結果可能不一樣。所以當須要作可重現可跨進程保持一致性的hash,須要用到hashlib模塊。加密
hashlib提供了常見的摘要算法,如MD5,SHA1等等翻譯
注:coding:utf-8
import hashlib # md5 m = hashlib.md5() m.update(b'Vivian') print(m.digest()) # 返回二進制的哈希值 b'\xe5if5\x05\x02\x1a!wR\xd6\xfa(\xae\r\xcb' print(m.hexdigest()) # 返回十六進制的哈希值 e569663505021a217752d6fa28ae0dcb m.update('你好'.encode('utf-8')) print(m.hexdigest()) # 6ea8d7a29ea0706bdaca285e1d2ddd17 # m兩次加密後的值 等於 兩次字串拼接後一次加密的值 n = hashlib.md5() n.update('Vivian你好'.encode('utf-8')) print(n.hexdigest()) # 6ea8d7a29ea0706bdaca285e1d2ddd17 # sha1 m = hashlib.sha1() m.update(b'Vivian') print(m.hexdigest()) # 587bf2d7314da0ae33623bed16d872620b2768be # sha256 m = hashlib.sha256() m.update(b'Vivian') print(m.hexdigest()) # 2f7caf725fb93a456e84100bdf98b91405e62f6e7ca99bc4e0b4a1993bf9e5c0 # sha512 m = hashlib.sha512() m.update(b'Vivian') print(m.hexdigest()) # d75e73edd6ab1801e3dbfcd5c504dca16f3c252f750411da7fdddc9b60013ad97844b6f86de29d3f9a6d07d2c93a53d6c9de9b548b8697f3c2494857176011dc