有没有办法在python中为对象生成一个类似哈希的ID,它只基于对象的属性值?例如,
class test:
def __init__(self, name):
self.name = name
obj1 = test('a')
obj2 = test('a')
hash1 = magicHash(obj1)
hash2 = magicHash(obj2)
我正在寻找的是hash1 == hash2。 python中是否存在类似的内容?我知道我可以测试obj1.name == obj2.name,但我正在寻找一些我可以在任何对象上使用的通用。
答案 0 :(得分:6)
你的意思是这样的?
使用特殊方法__hash__
class test:
def __init__(self, name):
self.name = name
def __hash__(self):
return hash(self.name)
>>> hash(test(10)) == hash(test(20))
False
>>> hash(test(10)) == hash(test(10))
True
答案 1 :(得分:3)
获得独特的比较:
要获得独特性,您可以序列化数据,然后比较序列化值以确保它完全匹配。
示例:
import pickle
class C:
i = 1
j = 2
c1 = C()
c2 = C()
c3 = C()
c1.i = 99
unique_hash1 = pickle.dumps(c1)
unique_hash2 = pickle.dumps(c2)
unique_hash3 = pickle.dumps(c3)
unique_hash1 == unique_hash2 #False
unique_hash2 == unique_hash3 #True
如果您不需要每个对象的唯一值,但大多数都是唯一的:
请注意,相同的值将始终减少到相同的哈希值,但是2个不同的值可能会减少到相同的哈希值。
你不能使用内置的hash()函数(除非你覆盖__hash__
)
hash(c1) == hash(c2) #False
hash(c2) == hash(c3) #False <--- Wrong
或类似使用pickle序列化数据然后使用zlib.crc32。
import zlib
crc1 = zlib.crc32(pickle.dumps(c1))
crc2 = zlib.crc32(pickle.dumps(c2))
crc3 = zlib.crc32(pickle.dumps(c3))
crc1 == crc2 #False
crc2 == crc3 #True
答案 2 :(得分:2)
查看hash() build in function和__hash__()
object method。这些可能正是您所寻找的。您必须为自己的课程实施__hash__()
。
答案 3 :(得分:2)
我想
def hash_attr(ins):
return hash(tuple(ins.__dict__.items()))
根据其属性对任何实例进行哈希处理。