欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 操作,如果沒有則會(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.6
pwd = "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也包含這些字符的.

相關(guān)文章

  • 詳解Python中的字符串格式化

    詳解Python中的字符串格式化

    這篇文章主要為大家介紹了Python中的字符串格式化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Python ADF 單位根檢驗(yàn) 如何查看結(jié)果的實(shí)現(xiàn)

    Python ADF 單位根檢驗(yàn) 如何查看結(jié)果的實(shí)現(xiàn)

    這篇文章主要介紹了Python ADF 單位根檢驗(yàn) 如何查看結(jié)果的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-06-06
  • Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    在日常開發(fā)中,對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化是常見的數(shù)據(jù)操作,Python提供了兩個(gè)模塊方便開發(fā)者實(shí)現(xiàn)數(shù)據(jù)的序列化操作,即?json?模塊和?pickle?模塊。本文就為大家詳細(xì)講解這兩個(gè)模塊的使用,需要的可以參考一下
    2022-07-07
  • Python PyTorch實(shí)現(xiàn)Timer計(jì)時(shí)器

    Python PyTorch實(shí)現(xiàn)Timer計(jì)時(shí)器

    這篇文章主要為大家詳細(xì)介紹了Python PyTorch如何實(shí)現(xiàn)簡(jiǎn)單的Timer計(jì)時(shí)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • python opencv之SURF算法示例

    python opencv之SURF算法示例

    這篇文章主要介紹了python opencv之SURF算法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-02-02
  • Python文件的應(yīng)用之序列化與反序列化詳解

    Python文件的應(yīng)用之序列化與反序列化詳解

    為了簡(jiǎn)化數(shù)據(jù)類型的寫入和獲取,今天我們來(lái)學(xué)習(xí)一個(gè)新的知識(shí)點(diǎn)——序列化。通過學(xué)習(xí)序列化,可以不必過分擔(dān)心寫入文件的數(shù)據(jù)類型是什么,并且讀取文件也可以非常輕松的還原數(shù)據(jù)類型。感興趣的可以了解一下
    2022-03-03
  • Python 中字符串拼接的多種方法

    Python 中字符串拼接的多種方法

    本篇文章給大家介紹python中字符串拼接的多種方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • 詳解python播放音頻的三種方法

    詳解python播放音頻的三種方法

    這篇文章主要介紹了python播放音頻的三種方法,每種方法通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python圖像和辦公文檔處理總結(jié)

    python圖像和辦公文檔處理總結(jié)

    在本文里我們給大家整理了關(guān)于python圖像和辦公文檔處理的相關(guān)知識(shí)點(diǎn)內(nèi)容以及重點(diǎn)內(nèi)容總結(jié),有需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • 如何使用Python在2秒內(nèi)評(píng)估國(guó)際象棋位置詳解

    如何使用Python在2秒內(nèi)評(píng)估國(guó)際象棋位置詳解

    關(guān)心編程語(yǔ)言的使用趨勢(shì)的人都知道,最近幾年,國(guó)內(nèi)最火的兩種語(yǔ)言非Python與Go莫屬,下面這篇文章主要給大家介紹了關(guān)于如何使用Python在2秒內(nèi)評(píng)估國(guó)際象棋位置的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評(píng)論