根据属性为Python对象生成唯一ID
有没有办法在Python中为对象生成一个类似哈希的ID,这个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,但我想要的是一种可以在任何对象上使用的通用方法。
4 个回答
2
我想
def hash_attr(ins):
return hash(tuple(ins.__dict__.items()))
哈希是根据某个东西的属性来生成一个唯一的标识。
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
如果你不需要每个对象都有唯一的值,但大部分值是唯一的:
要注意,同样的值总是会变成相同的哈希值,但两个不同的值可能会变成相同的哈希值。
你不能使用像内置的 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
7
你是指像这样吗?使用这个特殊的方法 __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