2017-02-10 3 views
0

수정 된 목록을 업데이트하지 못하도록 코드를 작성하려고합니다. 이것을 위해 SHA1 해시 값을 계산하고 있지만 ipython 인터프리터를 다시 시작하면이 해시의 hexdigest()가 다른 결과를 생성합니다. 왜 이런거야? python3에서 SHA1을 사용하여 해싱을해도 결과가 동일하지 않습니다.

In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

가 hashid을 다시 초기화하고 작동 같은 ipython3 콘솔에서 다시 해시 계산을 수행 할 때 :

In [7]: exit 
[email protected] ~/ $ ipython3 
In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '6e5813fcb173e35e81d6138eab4d21482885e7eb' 
:

In [5]: hashid = hashlib.sha1() 

In [6]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [7]: hashid.hexdigest() 
Out[7]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

하지만 내 콘솔을 중지하고 다시 시작하는 서로 다른 결과를

왜 이런가요? 그리고 어떻게 동일한 SHA1 해시/hexdigest 결과를 생산할 수있는 동일한 정렬 목록 hasing?

답변

1

값에 보장 된 순서가 없으므로 set/frozenset 개체의 repr의 순서에 의존 할 수 없습니다 (실제로 서비스 거부 방지 기능으로 문자열의 해시 코드가 달라집니다). 동일한 버전의 Python을 여러 번 실행하면 set 주문이 변경됩니다).

frozensetsorted 전화를 교환하면 일관성있게 재현 할 수 있습니다.

hashid.update(repr(sorted(frozenset(["a","b","c"]))).encode("utf-8")) 
+0

아의 TNX, 의미가 있습니다 ...이 찾고있는 시간을 보냈다 수 : listfrozenset 당신에게 고유성 보장을 얻을 것이다 동안, 순서를 보장 한 정렬. 이것은 그것을 많이 분명히합니다. – RvL

+0

** "고맙습니다"라고 대답하는 말에 답변을 추가하지 마십시오. ** 답변이 도움이 될 경우 [받아들입니다] (http://stackoverflow.com/help/someone-answers). BTW는 29 가지 질문을 받았지만 첫 질문 만 수락했습니다. 왜? –