dict
中的键)在运行中不稳定。是否可以使用 dill 或其他库之类的东西来获取在运行和不同计算机上稳定的函数的哈希值? (
id
当然不稳定)。
dill
作者。我编写了一个名为
klepto
的包,它是一个分层缓存/数据库抽象,可用于本地内存散列和跨并行/分布式资源的对象共享。它包括用于构建函数 id 的多个选项。请参阅
klepto.keymaps
和
klepto.crypto
了解哈希选择 - 有些跨并行/分布式资源工作,有些则不然。选择之一是使用
dill
或其他方式进行序列化。
klepto
与
joblib
类似,但专门设计用于在单个 Python 会话之外实现对象持久性和共享。
klepto
中可能有类似
dask
的内容。
import hashlib
from operator import xor
from struct import unpack
def stable_hash(a_string):
sha256 = hashlib.sha256()
sha256.update(bytes(a_string, "UTF-8"))
digest = sha256.digest()
h = 0
#
for index in range(0, len(digest) >> 3):
index8 = index << 3
bytes8 = digest[index8 : index8 + 8]
i = unpack('q', bytes8)[0]
h = xor(h, i)
#
return h
用于字符串参数。使用它例如对于字典,您可以传递 str(tuple(sorted(a_dict.items()))) 或类似的东西作为参数。在这种情况下,“排序”对于获得“规范”表示很重要。
id
在不同的进程中几乎永远不会相同,尽管在不同的机器上肯定是相同的。根据文档:
id(对象): 返回对象的“身份”。这是一个整数,即 保证该对象在其存在期间是唯一且恒定的 寿命。具有不重叠生命周期的两个对象可能具有相同的生命周期 id() 值。这意味着
id
should 是不同的,因为脚本的每个实例创建的对象驻留在内存中的不同位置,并且不是同一个对象。
id
定义身份,它不是代码块的校验和。在执行脚本的不同实例中唯一保持一致的是函数的名称。
您可以用来确定性地识别脚本中的代码块的另一种方法是计算实际文本的校验和。但是控制方法的内容应该由像 git 这样的版本控制系统来处理。如果您需要计算代码或其一部分的哈希和,那么您可能正在做一些次优的事情。