2012-06-28 2 views
3

나는 실제 이유는 파이썬 2.7에서 관찰 된 행동이 무엇인지 궁금 :hashlib - 왜 다이제스트는 일치하지만 맨손 개체는 그렇지 않습니까?

import hashlib 
hashlib.md5('foo') == hashlib.md5('foo') 

false를 돌려줍니다. 하지만 ...

import hashlib 
hashlib.md5('foo').hexdigest() == hashlib.md5('foo').hexdigest() 

true를 반환합니다. hexdigest/digest가 최종 문자열 표현을 반환한다는 것을 이해합니다. 그러나 같은 데이터가 두 해시 객체에 직접 입력되었으므로 서로 평등하다고 평가해서는 안됩니까? md5 HASH 개체가 마법을 __eq__ 메서드라고 할 때 내부 ID를 알고 있지 않습니까? 사물 자체가 어떤 이유로 불평등을 평가합니까? 정말 궁금해서.

+0

hashlib.md5 ('foo')는 id와 일치하는 객체입니다. – PasteBT

+0

_why_에 대해서는 '__eq__'을 정의하지 않았습니다 ... Well , t를 비교하는 유효한 경우 hash _objects_는 당신이'hexdigest()'를 호출 할 때까지 계산되지 않는 hash _strings_을 비교하고자 할 때 사용됩니다 ... 그래서 당신은 다이제스트를 직접 비교할 수 있습니다. – voithos

+0

해시 객체의 내부 중간 상태를 서로 비교하는 기능은 없습니다. 물론, __eq__ 메쏘드는 구현하기 위해 digest()를 뒤에서 호출 할 수는 있지만 그만한 가치는없는 것 같습니다. 두 가지가 같은 것을 비교하고 싶다면 비교하기 위해 다이제스트 또는 16 진법으로 해시를 마무리하십시오. – gps

답변

6

hashlib.md5 개체에 대한 동등 비교가 없으므로 서로 다른 개체이므로 결과가 false입니다.

.hexdigest 메서드는 문자열 (또는 Python 3을 사용하는 경우 바이트 문자열)을 생성하고 문자열을 비교할 수 있습니다.

x = hashlib.md5('foo') 
x == x # is True because it's the same object 
관련 문제