我正在为搜索系统开发后端应用程序。搜索系统将文件复制到临时目录并为其提供随机名称。然后它将临时文件的名称传递给我的应用程序。我的应用程序必须在有限的时间内处理每个文件,否则它将被关闭 - 这是类似监管机构的安全措施。处理文件可能需要很长时间,所以我需要设计能够处理这种情况的应用程序。如果我的应用程序在下次搜索系统想要索引同一文件时关闭,它可能会给它一个不同的临时名称。
显而易见的解决方案是在搜索系统和后端之间提供一个中间层。它会将请求排入后端并等待结果到达。如果请求在中间层中超时 - 没问题,后端将继续工作,只有中间层重新启动,并且当搜索系统稍后重复请求时,它可以从后端检索结果。
问题是如何识别文件。他们的名字随机变化。我打算使用像MD5这样的哈希函数来散列文件内容。我很清楚birthday paradox并使用链接文章中的估算来计算概率。如果我假设我的文件不超过100 000个,那么两个文件具有相同MD5(128位)的概率约为1,47x10 -29 。
我是否应该关注这种碰撞概率,或者只是假设相等的散列值意味着相同的文件内容?
答案 0 :(得分:38)
Equal hash意味着相等的文件,除非有人恶意攻击您的文件并注入冲突。 (如果他们从互联网上下载的话可能就是这种情况)如果是这种情况则选择基于SHA2的功能。
没有偶然的MD5碰撞,1,47x10 -29 真是一个非常小的数字。
为了克服重新编写大文件的问题,我将采用3阶段身份方案。
因此,如果您看到一个新尺寸的文件,您肯定知道您没有重复。等等。
答案 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/