国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python版本坑:md5例子(python2與python3中md5區(qū)別)

2020-01-04 16:52:20
字體:
供稿:網(wǎng)友

起步

對(duì)于一些字符,python2和python3的md5加密出來是不一樣的.

# python2.7pwd = "xxx" + chr(163) + "fj"checkcode = hashlib.md5(pwd).hexdigest()print checkcode # ea25a328180680aab82b2ef8c456b4ce# python3.6pwd = "xxx" + chr(163) + "fj"checkcode = hashlib.md5(pwd.encode("utf-8")).hexdigest()print(checkcode) # b517e074034d1913b706829a1b9d1b67

按代碼差異來將,就是在python3中需要對(duì)字符串進(jìn)行 encode 操作,如果沒有則會(huì)報(bào)錯(cuò):

 checkcode = hashlib.md5(pwd).hexdigest()TypeError: Unicode-objects must be encoded before hashing

這是因?yàn)榧用軙r(shí)需要將字符串轉(zhuǎn)化為 bytes 類型,3默認(rèn)編碼是 utf-8 .所以我用utf-8進(jìn)行解碼.

分析

如果字符串中沒有 chr(163) ,那么兩個(gè)版本結(jié)果是一致的,也就是說問題出在這個(gè)chr(163)中:

# python2.7>>> chr(163)'/xa3'# python3.6>>> chr(163)'/xa3'

在這里說明通過 chr 得到的結(jié)果是一致的, 將它轉(zhuǎn)為 bytes 類型看看:

# python2.7>>> bytes(chr(163))'/xa3'# python3.6>>> chr(163).encode()b'/xc2/xa3'

python3中,在 num<128 的時(shí)候,使用 chr(num).encode('utf-8') 得到的是 一個(gè) 字符的ascii十六進(jìn)制,而 num>128 的時(shí)候,使用 chr(num).encode('utf-8') 得到的是 兩個(gè) 字節(jié)的ascii十六進(jìn)制.

解決
改用 latin1 編碼進(jìn)行解碼:

# python3.6pwd = "xxx" + chr(163) + "fj"checkcode = hashlib.md5(pwd.encode("latin1")).hexdigest()print(checkcode)  # ea25a328180680aab82b2ef8c456b4ce

額外
為什么是 latin1 編碼呢.答案還是挺有意思的.

先說chr函數(shù),通過 help(chr) 可以查看:

chr(...)  chr(i) -> Unicode character  Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

意思是它返回Unicode編碼中指定位置的一個(gè)字符.python3內(nèi)部也是用Unicode表示左右字符,即str類型.而通過encode后會(huì)編碼成 bytes 類型.

ascii編碼中每個(gè)字符編碼是一個(gè)byte,但只有1-127. 超過的部分128-255則屬于 Extended ASCII ,python3 中默認(rèn)的ascii中不包含這部分,所以如果執(zhí)行 chr(163).encode("ascii") 就會(huì)報(bào)錯(cuò) 'ascii' codec can't encode character '/xa3' in position 3: ordinal not in range(128)

因此需要一個(gè)含有128-255中的部分字符的編碼,且采用1個(gè)Byte固定大小編碼,比如ISO 8859-1,也就是 latin1.當(dāng)然還有其他編碼如cp1252也包含這些字符的.

 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延寿县| 保山市| 佛教| 开封市| 磐安县| 枝江市| 林州市| 烟台市| 方山县| 伊春市| 宁化县| 客服| 灵石县| 依兰县| 佛坪县| 额敏县| 东源县| 大庆市| 海晏县| 铁岭县| 惠水县| 新建县| 汉阴县| 缙云县| 大邑县| 繁昌县| 大姚县| 南投市| 苏尼特右旗| 瓦房店市| 芮城县| 和硕县| 贡觉县| 定安县| 弋阳县| 阿克苏市| 城市| 建阳市| 娄底市| 彩票| 斗六市|