我想知道在python 2.7中观察到的行为的实际原因是什么:
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__
对象不会意识到内部身份吗?为什么对象本身会评估不平等?真的很好奇。
答案 0 :(得分:6)
hashlib.md5
个对象没有相等比较,因为它们是不同的对象,结果是错误的。
.hexdigest
方法生成一个字符串(如果你在Python 3上,则生成字节串),并且可以比较字符串。
顺便说一句:
x = hashlib.md5('foo')
x == x # is True because it's the same object
答案 1 :(得分:1)
原因可能是使用==来比较校验和是针对时间攻击的:https://groups.google.com/forum/?fromgroups=#!topic/keyczar-discuss/VXHsoJSLKhM(https://stackoverflow.com/a/14487254/821378中jwilkins的学分)
在最近的Python版本中,添加了一个函数,但我忘记了它是针对所有哈希还是仅针对HMAC:http://docs.python.org/3/library/hmac#hmac.compare_digest