我需要计算一个"哈希"这允许我唯一地识别一个对象,包括它的内容和父类。
比较这些"哈希"我希望能够判断一个对象自上次扫描后是否发生了变化。
我已经找到了很多关于如何使对象可以清除的例子,但不是关于如何计算父类的哈希值。
重要的是要注意在不同的执行过程中进行比较。我这样说是因为我认为比较对象的id()
因为对象的id /地址对于不同的执行可能是不同的。
我想过去检查,但我担心这可能不是很有效,而且如果对象的父类继承自另一个类,我也不太确定如何工作。
如果我有权访问实例和类的实际内存原始数据'存储代码,我只能计算它的散列。
有什么想法吗?
答案 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
>>>
看起来不错?
答案 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