对于sympy对象,Python哈希不是确定性的

时间:2018-04-18 17:06:48

标签: hash sympy

我正在向函数提供符号表达式,并希望在之前已经处理过输入参数集时返回先前计算的结果。为此,我考虑散列传递给函数的参数,但这不起作用,因为hash在应用于符号表达式时似乎不会产生确定结果。例如,以下代码打印始终不同的值。

import sympy as sym
x = sym.symbols('x')
print(hash(x))

有没有办法确定性地散列Sympy符号表达式?

2 个答案:

答案 0 :(得分:2)

您正在遇到称为哈希随机化的安全功能。

$ cat hash_test.py 
import sympy as sym
x = sym.symbols('x')
print(hash(x))

使用这个简单的例子进行了几次运行:

$ python hash_test.py 
6842375726913792912
$ python hash_test.py 
5041915772945005780
$ python hash_test.py 
-3461975266180802906

无哈希随机化运行以获得相同的结果:

$ PYTHONHASHSEED=0 python hash_test.py 
-2285490307665029553
$ PYTHONHASHSEED=0 python hash_test.py 
-2285490307665029553
$ PYTHONHASHSEED=0 python hash_test.py 
-2285490307665029553

答案 1 :(得分:1)

从这里: http://docs.sympy.org/latest/python-comparisons.html https://docs.python.org/dev/glossary.html#term-hashable

  

作为用户定义类的实例的对象可以通过   默认。他们都比较不平等(除了他们自己)和他们的   哈希值派生自他们的id()。

def __hash__(self):
    return id(self)

我想象的是你有不同哈希的原因,因为实例有不同的id。

我希望你能从我发布的第一份文件中得到你需要的比较。