Python 3的默认散列函数不是确定性的(散列(无)因运行而异),甚至不能尽最大努力生成具有高概率的唯一ID(散列(-1)= = hash(-2)为True)。
是否存在一些其他散列函数作为校验和(即两个数据结构散列到相同值的概率可忽略不计,并且每次运行python都返回相同的结果),并且支持所有python的内置数据类型,包括无?
理想情况下,它将在标准库中。我可以挑选对象或获取字符串表示,但这似乎不必要的hacky,并且浮点数的字符串表示可能是非常糟糕的校验和。
我在标准库中找到了加密哈希值(md5,sha256),但它们只在字节串上运行。
Haskell似乎在他们的标准库中得到了这个〜几乎是正确的......但是“Nothing :: Maybe Int”和0都哈希到0,所以它在那里也不完美。
答案 0 :(得分:1)
您可以在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,根据AndrewWagner的评论。
顺便说一下仅供参考因为这会导致安全漏洞,PYTHONHASHSEED环境变量可用于禁用整个应用程序中哈希的随机化。