预灰化键以节省内存。

prehashed的Python项目详细描述


预灰化

Build Status

一种python字典,在插入dict之前对键进行哈希运算。当字典的键相当大(例如长刺)时,这会节省大量内存。

关键是我们可以廉价地存储非常大(长字符串)的密钥例如,当将文档存储在标记化的dailymail数据集中时,密钥占用1.018gb,而此实现占用10.53mb。使用内置的hash函数可以节省少量空间(7.79mb对10.53mb),但由于python在运行过程中更改种子,因此无法在运行过程中共享此结果

碰撞

显然,我们想知道发生哈希冲突的概率是多少?。我们可以通过反问来解决这个问题。所有密钥都是唯一的概率是多少?一旦我们有了这个,我们就可以用1减去这个来回答原来的问题

给定n个可能的散列值(2 ** 160对于sha1),我们知道第一个散列是唯一的,然后对于第二个散列,我们知道可以使用并且仍然是唯一的N - 1散列,这意味着我们的概率是N - 1 / N。这种情况会持续到N - 2, 3等。因此,如果我们对k键进行散列,我们可以发现它们在PI i=1 -> k-1 (N - i) / N中都是唯一的概率。这可以近似为。这可以用(k*(k 1)/(2×n))近似于小k,因为^ {CD9}},当n为2*160时,大多数k是小的。

图表

总而言之,这里有一张表,上面列出了一些钥匙相撞的可能性。

kOdds
^{}^{}
^{}^{}
^{}^{}
^{}^{}
^{}^{}

因此,除非您计划使用put171,000,000,000,000,000,000,000键,否则如果您的代码有错误,人们将死亡,我不会担心冲突。

钥匙碰撞的可能性很小当这种情况发生时,本词典无法检测到,因此这些键将相互覆盖这是如此罕见,以至于git也没有一个缓解策略

虽然冲突是非常罕见的,如果你担心的话,我建议你所有的值都是相同的类型,这样你就不会期望字符串,如果发生冲突,在极不可能的情况下,会得到一个in t。

如果您仍然害怕冲突,还有一个函数initial_add(k, v),它将修改您的密钥,直到没有冲突为止,将其添加到字典中,并返回要使用的新密钥。你需要保留这个密钥,以便稍后获取值,这样就打破了这个dict的要点,你可以在这里扔掉你的密钥。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使Eclipse在其控制台中显示最顶层的异常,而不是完整的堆栈跟踪   java如何为一个组件提供多个DropTargetListener?   在Eclipse包资源管理器中,有些文件不可见?   java在Spring Boot中使用@Bean配置设置类属性的默认值   在JTextPane中使用#链接的Java HTML?   java当应用程序打开时,如何将通知内容发送给活动?   java Android ROOM如何编写包含多个实体的查询,这是在哪里完成的?   Play Framework的java登录/注销问题?   java如何从安卓 Cordova/Phonegap调用javascript函数   JavaFX8如何在Java8中显示上次修改的LocalDateTime?   javabean验证中的多个约束注释   java使用JSTL设置请求属性   java在Android启动的服务中调用函数   用于检查xml是否包含键和值的java XPath表达式   在java游戏中使用斜坡因子挥杆   Java文件:尝试使用FileWriter将结果附加到已经存在的文件中   bootclasspath Java Xbootclasspath,相对路径   java我如何让这个“怪物战斗模拟器”工作?   swing使用动作侦听器隐藏和显示java桌面应用程序