廖雪峯的官方網站學習MD5加密,網址:「http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328251266d86585fc9514536a638f06b41908d44000」python
報「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
對於中文,則進行轉碼:ui
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前要求進行編碼轉換,是由於同一個字符串在不一樣的編碼體系下有不一樣的值,爲確保不發生歧義必需要進行一次顯性轉換。加密