根据属性为Python对象生成唯一ID

10 投票
4 回答
5585 浏览
提问于 2025-04-15 13:50

有没有办法在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

撰写回答