python

时间:2017-07-10 14:49:04

标签: python hash

Python 3的默认散列函数不是确定性的(散列(无)因运行而异),甚至不能尽最大努力生成具有高概率的唯一ID(散列(-1)= = hash(-2)为True)。

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

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

我在标准库中找到了加密哈希值(md5,sha256),但它们只在字节串上运行。

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

1 个答案:

答案 0 :(得分:1)

您可以在hashlib对象上使用pickled中的任何哈希值。  pickle.dumps not suitable for hashing

您可以将排序键jsonhashlib一起使用。

hashlib.md5(json.dumps(data, sort_keys=True)).hexdigest()

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

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