MD5(MD5差python2とのpython3中)の例として、必要性の友人は、以下を参照することができます:この記事では、Pythonのバージョンピットが記述する
開始します
一部の文字については、MD5暗号化のうちpython2とのpython3は、それは同じではありません。
# 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
なり、エラーが発生していない場合は、続行のpython3内の文字列のコードの違いをエンコードする必要があります:
checkcode = hashlib.md5(pwd).hexdigest()
TypeError: Unicode-objects must be encoded before hashing
これが原因タイプバイト暗号化された文字列を変換する必要のある、3がデフォルトのエンコーディングはUTF-8です。私は、UTF-8デコードします。
分析
文字列は、CHR(163)しない場合、結果の2つのバージョンが一致している、そして、それはこのCHR(163)での問題です。
# python2.7
>>> chr(163)
'\xa3'
# python3.6
>>> chr(163)
'\xa3'
ここではCHR得られた結果で一貫している示され、それがバイト型になります:
# python2.7
>>> bytes(chr(163))
'\xa3'
# python3.6
>>> chr(163).encode()
b'\xc2\xa3'
python3、NUM <.encodeをCHR(NUM)を使用する場合128( 'UTF-8')が得られるASCII 16進数の文字、およびNUM> 128 CHRを使用して(NUM).encode ( 'UTF-8')は、2つのASCIIバイトの16進数が得られます。
解決
LATIN1エンコード・デコードにスイッチを:
# python3.6
pwd = "xxx" + chr(163) + "fj"
checkcode = hashlib.md5(pwd.encode("latin1")).hexdigest()
print(checkcode) # ea25a328180680aab82b2ef8c456b4ce
エクストラ
なぜそれをコードlatin1のである。答えは非常に興味深いものでした。
私はCHR機能をお話しましょう、表示することができますヘルプ(CHR):
chr(...)
chr(i) -> Unicode character
Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.
指定された位置を返す一つの文字のUnicodeコードはすなわち使用Unicode文字列strのタイプ左右内部.python3文字で表されることを意味する。タイプによってエンコードするバイトに符号化された後。
「(各文字エンコーディングのASCIIエンコーディングはバイトですが、唯一の1-127。128-255拡張ASCII属し部品の上に、のpython3デフォルトのASCIIは、あなたがCHRを実行するので、場合(163).encodeをこのセクションが含まれていませんない範囲で序(128):アスキー「)は、エラー 『ASCII』コーデックができないエンコード文字 『\ XA3 3』位にあるがスローされます
従って128-255において必要とLATIN1なるようISO 8859-1などの文字の符号化部と、固定サイズのバイトエンコーディングの使用を含んでいた。CP1252はもちろん、他のエンコーディングこれらの文字も含まれます。
私たちは、Pythonの学習サイトをお勧めします、入力する]をクリックし、プログラムを学ぶことがいかに古い見て!基本的なPythonスクリプト、爬虫類、ジャンゴ、データマイニング、技術をプログラミング、仕事の経験だけでなく、小型のpythonパートナーのシニア入念な研究から戦闘にゼロベースの情報のプロジェクトを仕上げ!時限プログラマPythonは日常の技術を説明している方法は、学習と細部への注意を払う必要性へのいくつかを共有します