我正在向函数提供符号表达式,并希望在之前已经处理过输入参数集时返回先前计算的结果。为此,我考虑散列传递给函数的参数,但这不起作用,因为hash
在应用于符号表达式时似乎不会产生确定结果。例如,以下代码打印始终不同的值。
import sympy as sym
x = sym.symbols('x')
print(hash(x))
有没有办法确定性地散列Sympy符号表达式?
答案 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。
我希望你能从我发布的第一份文件中得到你需要的比较。