2012-06-28 56 views
3

我想知道什麼實際的原因存在所觀察到的行爲在Python 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返回最終的字符串表示,但是由於直接將相同的數據輸入到兩個哈希對象中,它們不應該彼此相等嗎?當魔術__eq__方法被調用時,md5 HASH對象不會知道內部身份嗎?物體本身評估不平等的原因是什麼?真的只是好奇。

+0

hashlib.md5('foo')是一個對象,與它的編號 – PasteBT

+0

至於_why_他們沒有定義'__eq__' ...好吧,比較t的有效情況當你希望比較它們的散列_strings_時,它將不會被計算出來,直到你調用'hexdigest()'...所以你可以直接比較這些摘要。 – voithos

+0

不支持比較哈希對象的內部中間狀態。當然,可以實現一個__eq__方法,它可以在後臺調用digest()來做到這一點,但看起來並不值得。如果你想比較兩件事情是否相同,使用摘要或十六進制方法自己完成散列比較。 – gps

回答

6

對於hashlib.md5對象沒有相等的比較,因此它們是不同的對象,結果是錯誤的。

.hexdigest方法會生成一個字符串(如果您使用的是Python 3,則爲字節字符串)並且可以比較字符串。

順便說一句:

x = hashlib.md5('foo') 
x == x # is True because it's the same object 
相關問題