最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年06月20日 23:33:51   作者:hongweipeng  
這篇文章主要介紹了python版本坑:md5例子(python2與python3中md5區(qū)別),需要的朋友可以參考下

起步

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

# python2.7
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd).hexdigest()
print checkcode # ea25a328180680aab82b2ef8c456b4ce

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

按代碼差異來(lái)將,就是在python3中需要對(duì)字符串進(jìn)行 encode 操作,如果沒(méi)有則會(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)行解碼.

分析

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

# python2.7
>>> chr(163)
'\xa3'

# python3.6
>>> chr(163)
'\xa3'

在這里說(shuō)明通過(guò) 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.6
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd.encode("latin1")).hexdigest()
print(checkcode)  # ea25a328180680aab82b2ef8c456b4ce

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

先說(shuō)chr函數(shù),通過(guò) 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類型.而通過(guò)encode后會(huì)編碼成 bytes 類型.

ascii編碼中每個(gè)字符編碼是一個(gè)byte,但只有1-127. 超過(guò)的部分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也包含這些字符的.

相關(guān)文章

最新評(píng)論

新化县| 利津县| 遂宁市| 清丰县| 宁津县| 鸡西市| 肃南| 长白| 彝良县| 桂林市| 榕江县| 鹤山市| 宁波市| 于都县| 绍兴县| 馆陶县| 成武县| 甘谷县| 淮滨县| 鄂托克旗| 锡林郭勒盟| 繁昌县| 滦南县| 樟树市| 新营市| 保康县| 扎兰屯市| 永川市| 新平| 弥渡县| 右玉县| 霍州市| 太原市| 上栗县| 兰考县| 宣汉县| 房产| 武强县| 威海市| 永城市| 马关县|