Pythonオブジェクトをmd5ハッシュする関数を作成しようとしています。そして、私はpython2とpython3で同じmd5値を返したいと思っています。
python3 では pickle.dumps を知っています。バイトを返し、python2 では str を返します。ご覧のとおり、次のコードで同じ文字列が得られます。
print( [ pickle.dumps( obj, protocol = 2 ) ] ) # in python2
print( [ str( pickle.dumps( obj, protocol = 2 ) ) ] ) # in python3
どちらも私に与えます:
['\x80\x02]q\x00(U\x011q\x01K\x02U\x013q\x02K\x04e.']
しかし問題は、python3 では次のことです。
hashlib.md5.update( some_string )
エンコードする必要があります。文字列を python3 でエンコードすると、python2 と同じ md5 値が得られません。誰が解決策を教えてくれますか? 君たちありがとう。
ここに私のコードがあります:
from __future__ import print_function
import hashlib
import pickle
import sys
is_py2 = (sys.version_info[0] == 2)
obj = ['1',2,'3',4]
m = hashlib.md5()
if is_py2: # if it's python2
print( [ pickle.dumps( obj, protocol = 2 ) ] )
m.update( pickle.dumps( obj, protocol = 2 ) )
else: # if it's python3
print( [ str( pickle.dumps( obj, protocol = 2 ) ) ] )
m.update( pickle.dumps( obj, protocol = 2 ).encode( "utf-8" ) ) # I wish I could don not encode
print( m.hexdigest() )