Python 用hashlib。md5加密算法


廖雪峰的官方網站學習MD5加密,網址:“http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328251266d86585fc9514536a638f06b41908d44000”

 

報“TypeError: Unicode-objects must be encoded before hashing”這種錯誤呢其實意思是在進行md5運算前,需要對數據進行編碼。我運用的python版本與大佬的版本不符導致我出現了錯誤。出現這種錯誤推薦網址“http://blog.csdn.net/haungrui/article/details/6959340”

 

運行實例:

hashlib.md5(data)函數中,data參數的類型應該是bytes。也就是說我們在進行hash前必須把數據轉換成bytes類型:

1 import hashlib
2 m = hashlib.md5(b'123')     # b代表bytes型
3 m0 = hashlib.md5(b'abc')
4 mi = m.hexdigest()
5 mi0 = m0.hexdigest()
6 print(mi)
7 print(mi0)

運行結果:

1 202cb962ac59075b964b07152d234b70
2 900150983cd24fb0d6963f7d28e17f72

對於中文,則進行轉碼:

 1 import hashlib  2 data='你好'
 3 m = hashlib.md5(data.encode('gb2312'))  4 mi = m.hexdigest()
---------------------------------------------------
5 m0 = hashlib.md5(data.encode('utf8')) 6 mi0 = m.hexdigest() 7 print(mi) 8 print(mi0) 9 #運行結果如下(gb2312,utf8一樣): 10 # 39505368546302be2704b3d53b24203c 11 # 39505368546302be2704b3d53b24203c
# 還可以試試這些編碼:encode("mbcs")、encode("unicode_escape")
# 以及encode("raw_unicode_escape")

# -----數字時相同:
# c812727996fbf2201fa5ecc0acdccff0
# c812727996fbf2201fa5ecc0acdccff0
# -----英文時相同:
# 39505368546302be2704b3d53b24203c
# 39505368546302be2704b3d53b24203c
# -----中文時編碼不同,結果不同:
# f69c425381d6d8936733c6737f7d5a68
# 0342b5aff1e19bfaaa604e265278e317
# -----中英結合,中數結合以及中英數三者結合,結果都不同(只有有中文,就不同):
# 54f836634530a76a2c06e49123f06f1c
# 3dd056aefd606c44abc9d178e0c1170a

為什么不能直接hashlib.md5(data),非要強制進行編碼轉換,設計者的初衷何在?中文字符在Python中是以什么形式存在?

1 print('%x'%ord(data[0])) 2 4f60

中文字符在Python中是以unicode存在的。至此,所有的疑問都得以解除了。
在hash前要求進行編碼轉換,是因為同一個字符串在不同的編碼體系下有不同的值,為確保不發生歧義必須要進行一次顯性轉換。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM