栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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折叠到很长的长度,并

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号