python中的确定性递归散列

And*_*ner 4 python hash

Python 3 的默认散列函数不是确定性的(hash(None) 因运行而异),甚至没有尽最大努力以高概率生成唯一 id(hash(-1)==hash( -2) 是真的)。

是否有其他一些散列函数可以很好地作为校验和(即两个数据结构散列到相同值的概率可以忽略不计,并且每次运行 python 都返回相同的结果),并且支持所有 python 的内置数据类型,包括无?

理想情况下,它将在标准库中。我可以腌制对象或获取字符串表示,但这似乎不必要,并且浮点数的字符串表示可能是非常糟糕的校验和。

我在标准库中找到了加密哈希 (md5,sha256),但它们只对字节串进行操作。

Haskell 似乎在他们的标准库中得到了这个 ~ 几乎是正确的......但是“Nothing::Maybe Int”和 0 都散列到 0,所以它也不完美。

nit*_*zpo 6

您可以在腌制对象上使用hashlib 中的任何哈希。 pickle.dumps 不适合散列

您可以将排序键jsonhashlib.

hashlib.md5(json.dumps(data, sort_keys=True)).hexdigest()
Run Code Online (Sandbox Code Playgroud)

根据 AndrewWagner 的评论,摘自:https : //stackoverflow.com/a/10288255/3858507。

顺便说一下,仅供参考,因为这会导致安全漏洞PYTHONHASHSEED环境变量可用于在整个应用程序中禁用散列随机化。