Python 用hashlib。md5加密算法

廖雪峯的官方網站學習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前要求進行編碼轉換,是由於同一個字符串在不一樣的編碼體系下有不一樣的值,爲確保不發生歧義必需要進行一次顯性轉換。加密

相關文章
相關標籤/搜索