根据python对象的属性为其生成唯一ID

根据python对象的属性为其生成唯一ID,python,object,attributes,Python,Object,Attributes,有没有一种方法可以为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中是否存在类似的东西?我知道我可以测试ob

有没有一种方法可以为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,但我正在寻找可以在任何对象上使用的通用工具。

你是指这样的东西吗? 使用特殊方法


在那和那家餐馆喝一杯。这些可能正是你想要的。您必须为自己的类实现
\uuuu散列()

要获得唯一的比较:

为了唯一,您可以序列化数据,然后比较序列化的值,以确保它完全匹配

例如:

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()函数的功能(除非您重写
\uuuuuhash\uuuuuu

我想

def hash_attr(ins):
 return hash(tuple(ins.__dict__.items()))

根据实例的属性对其进行哈希运算。

@Bastien,你说得对。但这实际上取决于应用程序。在许多情况下,哈希就足够了。除了int()之外,不建议从hash__uuuuuuuuuuuuu(self)返回任何内容,因为这会使对象明显但不正确地可哈希(如在dicts中使用的),如果元组也有多个属性,例如:hash((self.first_uname,self.last_name))对于唯一的比较,如果对象很大,也可以使用zlib.compress使表示稍微小一些。不,pickle不适合哈希。结果可能会有所不同,正如罗伯特·布鲁尔(Robert Brewer)所描述的那样:不确定为什么,但对于CPython 2.5.1,我无法重现他的行为。对我来说,它总是得出相同的结果。@Matt Good:如果你继续阅读博客帖子上的评论,你会发现这个问题与cPickle而不是pickle有关。并且是由于引用计数。
hash(c1) == hash(c2) #False
hash(c2) == hash(c3) #False <--- Wrong
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
def hash_attr(ins):
 return hash(tuple(ins.__dict__.items()))