2014-10-12 1 views
1

md5 해시 파이썬 개체에 함수를 쓰려고합니다. 그리고 python2와 python3에서 동일한 md5 값을 반환합니다.python2,3에서 pickle.dumps 호환성

나는 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) 

가있다 인코딩 할 수 있습니다. 파이썬 3에서 문자열을 인코딩하면 파이썬 2에서와 같은 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()) 

답변

0

2 배와 3 배 인코딩을 할 수있는 라이너가 하나 있습니다. 어떤 인코딩에도 사용할 수 있습니다.

>>> hashlib.new(algorithm, repr(object).encode()).hexdigest() 

참조 : 변수 이름의 전체 문맥 https://github.com/uqfoundation/klepto/blob/master/klepto/crypto.py#L26 ... 및 인코딩, 직렬화 등에 더 많은 추상화를위한 파일의 나머지 부분을 참조하십시오. 파이썬 2.x와 3.x에서 모두 작동합니다.

python 2.x와 3.x에서 같은 해시를 반환하는 것이 좋습니다. 흠 ... 나는 그것이 효과 있다고 생각하지 않는다. 만약에 2.x에서와 같이 동일한 md5 인코딩을 3.x에서와 같이 반환한다면, repr 또는 pickle (프로토콜 2) 또는 다른 것을 먼저 써야 할 수도 있습니다.

Python 2.7.8 (default, Jul 13 2014, 02:29:54) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import klepto 
>>> klepto.crypto.hash(klepto.crypto.pickle(object), algorithm='md5') 
'ee16782749cb00e4b66922df545877f0' 

그래서, 피클과 md5가 작동하지 않는 것, 일반적으로 일부 개체가 2.x 및 3.x 사이에 변경 안하기 때문에 (예를 object에 대한 type 지금은 class의했다). 즉, repr 또는 다른 것들도 일반적으로 엔코더로 작동하지 않습니다.

Python 3.3.5 (default, Mar 10 2014, 21:37:38) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import klepto 
>>> klepto.crypto.hash(klepto.crypto.pickle(object), algorithm='md5') 
'35eb4c374cafe09c8ac01661701b6b6e' 

아마 당신을 위해 일하는 것이 klepto의 다른 인코더 중 하나가 있습니다.

0

1) pickle.dumps는 바이트 문자열을 반환합니다

여기 내 코드입니다.

2) 어떤 이유로 유니 코드 문자열에 이러한 내용이있는 경우 멀티 바이트 코덱을 utf-8 (기본값)으로 사용할 수 없습니다. 올바른 바이트하게 될 겁니다 있도록

foo = '\x80\x02]q\x00(U\x011q\x01K\x02U\x013q\x02K\x04e.'.encode('latin-1') 

latin-1은 1 일에 매핑해야합니다.


추 신 : 왜 인쇄물에 목록을 사용하고 있습니까? 어쩌면 당신은 찾고 있어요 print(repr(...))

+0

개체의 md5 값을 py2,3에서 동일하게 만드는 코드를 제공해 주시겠습니까? – MacSanhe