如何评估哈希冲突概率?

时间:2009-05-14 09:12:12

标签: language-agnostic md5 probability estimation

我正在为搜索系统开发后端应用程序。搜索系统将文件复制到临时目录并为其提供随机名称。然后它将临时文件的名称传递给我的应用程序。我的应用程序必须在有限的时间内处理每个文件,否则它将被关闭 - 这是类似监管机构的安全措施。处理文件可能需要很长时间,所以我需要设计能够处理这种情况的应用程序。如果我的应用程序在下次搜索系统想要索引同一文件时关闭,它可能会给它一个不同的临时名称。

显而易见的解决方案是在搜索系统和后端之间提供一个中间层。它会将请求排入后端并等待结果到达。如果请求在中间层中超时 - 没问题,后端将继续工作,只有中间层重新启动,并且当搜索系统稍后重复请求时,它可以从后端检索结果。

问题是如何识别文件。他们的名字随机变化。我打算使用像MD5这样的哈希函数来散列文件内容。我很清楚birthday paradox并使用链接文章中的估算来计算概率。如果我假设我的文件不超过100 000个,那么两个文件具有相同MD5(128位)的概率约为1,47x10 -29

我是否应该关注这种碰撞概率,或者只是假设相等的散列值意味着相同的文件内容?

5 个答案:

答案 0 :(得分:38)

Equal hash意味着相等的文件,除非有人恶意攻击您的文件并注入冲突。 (如果他们从互联网上下载的话可能就是这种情况)如果是这种情况则选择基于SHA2的功能。

没有偶然的MD5碰撞,1,47x10 -29 真是一个非常小的数字。

为了克服重新编写大文件的问题,我将采用3阶段身份方案。

  1. 仅文件化
  2. 文件大小+文件中不同位置的64K * 4散列
  3. 完整哈希
  4. 因此,如果您看到一个新尺寸的文件,您肯定知道您没有重复。等等。

答案 1 :(得分:4)

仅仅因为概率为1 / X并不意味着在你有X记录之前不会发生这种情况。这就像彩票一样,你不可能获胜,但某人在那里获胜。

如今,随着计算机的速度和容量(甚至没有谈论安全性,只是可靠性),没有理由不使用比MD5更大/更好的哈希函数来处理任何关键事件。升级到SHA-1可以帮助你在晚上睡得更好,但是如果你想要格外小心,那就去SHA-265吧,再也不去想它了。

如果性能确实是一个问题,那么使用BLAKE2实际上比MD5更快但支持256+位以使碰撞不太可能同时具有相同或更好的性能。但是,虽然BLAKE2已被很好地采用,但它可能需要为您的项目添加新的依赖项。

答案 2 :(得分:3)

我认为你不应该。

但是,如果您有两个相同文件具有不同(实名,而不是基于md5)的概念,则应该这样做。比如,在搜索系统中,两个文档可能具有完全相同的内容,但由于它们位于不同的位置,因此它们是不同的。

答案 3 :(得分:2)

我提出了一种蒙特卡罗方法,可以安全地睡觉,同时将UUID用于必须序列化而不会发生冲突的分布式系统。

from random import randint
from math import log
from collections import Counter

def colltest(exp):
    uniques = []
    while True:
        r = randint(0,2**exp)
        if r in uniques:
            return log(len(uniques) + 1, 2)
        uniques.append(r)

for k,v in Counter([colltest(20) for i in xrange(1000)]):
    print k, "hash orders of magnitude events before collission:",v

会打印出类似的内容:

5 hash orders of magnitude events before collission: 1
6 hash orders of magnitude events before collission: 5
7 hash orders of magnitude events before collission: 21
8 hash orders of magnitude events before collission: 91
9 hash orders of magnitude events before collission: 274
10 hash orders of magnitude events before collission: 469
11 hash orders of magnitude events before collission: 138
12 hash orders of magnitude events before collission: 1

之前我听过这个公式:如果你需要存储log(x / 2)键,请使用至少具有键空间e **(x)的散列函数。

重复实验表明,对于1000 log-20空间的人口,您有时会在log(x / 4)之前发生碰撞。

对于uuid4这是122位,这意味着我安全地睡觉,而几台计算机选择随机uuid,直到我有大约2 ** 31项。我所考虑的系统中的峰值交易大约是每秒10-20个事件,我假设平均值为7.这给了我一个大约10年的操作窗口,给出了极端的偏执狂。

答案 4 :(得分:0)

这是一个交互式计算器,可让您估算任何散列大小和对象数量的碰撞概率 - http://everydayinternetstuff.com/2015/04/hash-collision-probability-calculator/

相关问题