计算类和实例哈希

时间:2016-11-16 19:35:42

标签: python object hash

我需要计算一个"哈希"这允许我唯一地识别一个对象,包括它的内容和父类。

比较这些"哈希"我希望能够判断一个对象自上次扫描后是否发生了变化。

我已经找到了很多关于如何使对象可以清除的例子,但不是关于如何计算父类的哈希值。

重要的是要注意在不同的执行过程中进行比较。我这样说是因为我认为比较对象的id()因为对象的id /地址对于不同的执行可能是不同的。

我想过去检查,但我担心这可能不是很有效,而且如果对象的父类继承自另一个类,我也不太确定如何工作。

如果我有权访问实例和类的实际内存原始数据'存储代码,我只能计算它的散列。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

一般的想法是序列化对象然后采取哈希。然后,唯一的问题是找到一个好的图书馆。我们试试 dill

>>>import dill
>>>class a():
    pass
>>>b = a()
>>>b.x = lambda x:1
>>> hash(dill.dumps(b))
2997524124252182619
>>> b.x = lambda x:2
>>> hash(dill.dumps(b))
5848593976013553511
>>> a.y = lambda x: len(x)
>>> hash(dill.dumps(b))
-906228230367168187
>>> b.z = lambda x:2
>>> hash(dill.dumps(b))
5114647630235753811
>>> 

看起来不错?

dill:https://github.com/uqfoundation

答案 1 :(得分:0)

要检测对象是否已更改,您可以生成其JSON表示的哈希值,并与同一方法生成的最新哈希值进行比较。

import json

instance.foo = 5
hash1 = hash(json.dumps(instance.__dict__, sort_keys=True))

instance.foo = 6
hash2 = hash(json.dumps(instance.__dict__, sort_keys=True))

hash1 == hash2
>> False

instance.foo = 5
hash3 = hash(json.dumps(instance.__dict__, sort_keys=True))

hash1 == hash3
>> True

或者,由于json.dumps为我们提供了一个字符串,您只需比较它们而不是生成哈希值。

import json

instance.foo = 5
str1 = json.dumps(instance.__dict__, sort_keys=True)

instance.foo = 6
str2 = json.dumps(instance.__dict__, sort_keys=True)

str1 == str2
>> False