python中最短的哈希值,用于命名缓存文件

python中最短的哈希值,用于命名缓存文件,第1张

python中最短的哈希值,用于命名缓存文件

的生日悖论适用:给出了良好的散列函数,在碰撞发生前散列的预期数量为约SQRT(N),其中N是哈希函数可以取不同的值的数目。(我指向的维基百科条目给出了确切的公式)。因此,例如,如果您希望使用不超过32位,则对于大约64K个对象(即,

2**16
对象-
2**32
哈希函数可以采用的不同值的平方根),您的冲突担忧非常严重。您期望有几个对象(数量级)?

既然您提到碰撞是一个小麻烦,所以我建议您将哈希长度的目标设定为大约要拥有的对象数的平方,或者少一些,但不要少很多。

您想创建一个文件名-
是区分大小写的文件系统上的文件名(如Unix上的典型文件名),还是必须兼顾不区分大小写的系统?这很重要,因为您的目标是短文件名,但是在区分大小写的系统和不敏感的系统上,可以用来表示哈希作为文件名的每个字符的位数发生了巨大变化。

在区分大小写的系统上,您可以使用标准库的

base64
模块(我建议使用编码的“
urlsafe”版本,即此函数,因为避免在普通的base64中出现“
/”字符在Unix文件名中很重要)。这样每个字符有6个可用位,比十六进制的4位/字符好得多。

即使在不区分大小写的系统上,您仍然可以比十六进制做得更好-使用base64.b32enpre并获得每个字符5位。

这些函数接受并返回字符串。

struct
如果您选择的哈希函数生成数字,请使用模块将数字转换为字符串。

如果确实有成千上万个对象,我想您可以使用内置的哈希(32位,所以6-7个字符取决于您选择的编码)就可以了。对于一百万个对象,您需要40位左右(7或8个字符)-您可以将sha256折叠(异或,不要截断;-)以合理的位数(例如128左右)将sha256折叠到很长的长度,并

%
在编码之前使用运算符将其进一步切成所需的长度。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5662247.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存