一、哈希
1. 什么是可哈希(hashable)
簡要的說,可哈希的資料型別,即不可變的資料結構(字串str、元組tuple、物件集objects),
2. 哈希有什么作用
它是一個將大體量資料轉化為很小資料的程序,甚至可以僅僅是一個數字,以便我們可以用在固定的時間復雜度下查詢它,所以,哈希對高效的演算法和資料結構很重要,
3. 什么是不可哈希(unhashable)
同理,不可哈希的資料型別,即可變的資料結構 (字典dict,串列list,集合set),
4. hash(object)
hash() 用于獲取取一個物件(字串或者數值等)的哈希值,回傳物件的哈希值,
二、HASH(散列函式)
1. 簡介
哈希(hash)也翻譯作散列,Hash演算法,是將一個不定長的輸入,通過散列函式變換成一個定長的輸出,即散列值,
這種散列變換是一種單向運算,具有不可逆性即不能根據散列值還原出輸入資訊,因此嚴格意義上講Hash演算法是一種訊息摘要演算法,不是一種加密演算法,常見的hash演算法有:SM3、MD5、SHA-1等 ,
2. 應用
Hash主要應用在資料結構以及密碼學領域,
在不同的應用場景下,hash函式的選擇也會有所側重,比如在管理資料結構時,主要要考慮運算的快速性,并且要保證hash均勻分布;而應用在密碼學中就要優先考慮抗碰撞性,避免出現兩段不同明文hash值相同的情況發生,
2.1 在密碼學領域的應用
在密碼學中,Hash演算法的作用主要是用于訊息摘要和簽名,換句話說,它主要用于對整個訊息的完整性進行校驗,比如一些登陸網站并不會直接明文存盤用戶密碼,存盤的是經過hash處理的密碼的摘要(hash值),當用戶登錄時只需要對比輸入明文的摘要與資料庫存盤的摘要是否相同;即使黑客入侵或者維護人員訪問資料庫也無法獲取用戶的密碼明文,大大提高了安全性,
2.2 在資料結構中的應用
使用Hash演算法的資料結構叫做哈希表,也叫散串列,主要是為了提高查詢的效率,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函式就是hash函式,存放記錄的陣列叫做哈希表,在資料結構中應用時,有時需要較高的運算速度而榷訓考慮抗碰撞性,可以使用自己構建的哈希函式,
3. 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模塊
hashlib提供了常見的摘要演算法,如MD5,SHA1等等
注:coding:utf-8
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498586.html
標籤:Python
上一篇:基于后端和爬蟲創建的代理ip池
