Python 3 的默认散列函数不是确定性的(hash(None) 因运行而异),甚至没有尽最大努力以高概率生成唯一 id(hash(-1)==hash( -2) 是真的)。
是否有其他一些散列函数可以很好地用作校验和(即两个数据结构散列到相同值的概率可以忽略不计,并且每次运行 python 都返回相同的结果),并且支持所有 python 的内置数据类型,包括无?
理想情况下,它将在标准库中。我可以腌制对象或获取字符串表示,但这似乎不必要,并且浮点数的字符串表示可能是非常糟糕的校验和。
我在标准库中找到了加密哈希 (md5,sha256),但它们只对字节串进行操作。
Haskell 似乎在他们的标准库中得到了这个 ~ 几乎是正确的......但是“Nothing::Maybe Int”和 0 都散列到 0,所以它也不完美。
最佳答案
您可以使用来自 hashlib 的任何哈希值在 pickled目的。
pickle.dumps not suitable for hashing .
您可以使用排序键 json
与 hashlib
.
hashlib.md5(json.dumps(data, sort_keys=True)).hexdigest()
取自:https://stackoverflow.com/a/10288255/3858507 ,根据安德鲁瓦格纳的评论。
顺便说一下,仅供引用,因为这会导致 安全漏洞 , PYTHONHASHSEED环境变量可用于禁用整个应用程序中散列的随机化。
关于python - python中的确定性递归散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45015180/