2016-11-16 103 views
0

我需要计算一个“哈希”,它允许我唯一标识一个对象,它是内容和父类。计算类和实例哈希

通过比较这些“散列”,我希望能够判断一个对象自上次扫描以来是否发生了变化。

我发现很多关于如何使一个哈希的对象实例,但没有这么多关于如何计算父类的哈希值。

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

我认为诉诸检查,但我担心它可能不是非常有效的,也是我不是很确定,将如何,如果该对象的父类是从另一个类继承工作。

如果我有访问到该实例和类的代码存储的实际内存的原始数据,我可以计算的散列。

任何想法?

+0

,如果你想知道如果自上次检查改变你可以只生成你的对象的'__dict__'财产的哈希值。我认为在这里考虑其班级并不重要。 – lucasnadalutti

+0

我不确定内建的['hash()'](https://docs.python.org/2/library/functions.html#hash)没有涵盖什么情况?你可以扩展吗? – TemporalWolf

+0

@TemporalWolf如果你有'foo',一个'class Foo'的实例,做'foo.bar = 1','hash(foo)'会产生一个值,在你做完foo.bar后它将保持不变= 2'。 OP想要检测这种变化。 – lucasnadalutti

回答

1

一般的想法是序列化对象,然后取一个散列。那么,唯一的问题是找到一个好的图书馆。让我们尝试

>>>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 
>>> 

看起来不错?

萝:https://github.com/uqfoundation

+0

谢谢!它似乎工作!现在我有一些麻烦导入scons,但这是另一回事;) – viterbi

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 
+0

我一直在测试,似乎没有工作......再次只有对象变量似乎被考虑在内......如果继续并向类中添加一个方法或修改某些常量,那么哈希值仍然是相同的。 ... – viterbi