获取跨运行稳定的函数的哈希值

问题描述 投票:0回答:3
IIUC python 函数哈希(例如用作

dict

 中的键)在运行中不稳定。

是否可以使用 dill 或其他库之类的东西来获取在运行和不同计算机上稳定的函数的哈希值? (

id

当然不稳定)。

python hash dill
3个回答
2
投票
我是

dill

作者。我编写了一个名为 
klepto
 的包,它是一个分层缓存/数据库抽象,可用于本地内存散列和跨并行/分布式资源的对象共享。它包括用于构建函数 id 的多个选项。

请参阅

klepto.keymaps

klepto.crypto
 了解哈希选择 - 有些跨并行/分布式资源工作,有些则不然。选择之一是使用 
dill
 或其他方式进行序列化。

klepto

joblib
 类似,但专门设计用于在单个 Python 会话之外实现对象持久性和共享。 
klepto
中可能有类似
dask
的内容。


1
投票
今天我偶然发现“hash() 在运行中不稳定”。我现在正在使用

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()))) 或类似的东西作为参数。在这种情况下,“排序”对于获得“规范”表示很重要。


0
投票
正如您所提到的,

id

在不同的进程中几乎永远不会相同,尽管在不同的机器上肯定是相同的。根据
文档

id(对象): 返回对象的“身份”。这是一个整数,即 保证该对象在其存在期间是唯一且恒定的 寿命。具有不重叠生命周期的两个对象可能具有相同的生命周期 id() 值。

这意味着

id

 
should 是不同的,因为脚本的每个实例创建的对象驻留在内存中的不同位置,并且不是同一个对象。 id
定义身份,它不是代码块的校验和。

在执行脚本的不同实例中唯一保持一致的是函数的名称。

您可以用来确定性地识别脚本中的代码块的另一种方法是计算实际文本的校验和。但是控制方法的内容应该由像 git 这样的版本控制系统来处理。如果您需要计算代码或其一部分的哈希和,那么您可能正在做一些次优的事情。

© www.soinside.com 2019 - 2024. All rights reserved.