更一般地说,无论原始文件大小如何,每个文件生成特定哈希的概率是否都相同?
哈希函数通常编写为能够将数据均匀地分布到所有结果桶中。
如果您假设您的文件在可用大小的固定范围内均匀分布,假设只有1024(2^10)个不同大小的文件均匀分布,则最好仅存储文件大小,只能将碰撞的几率减少不同文件大小的数量。
注意:我们可以假设它是2 ^ 32个均匀分布和不同的大小,但这并不会改变其余部分的计算。
一般认为MD5(例如)发生冲突的概率是1/(2 ^ 128)
。
除非哈希函数中有特别构建的内容表明另外的情况。给定任何有效的X,使得P(MD5(X)== MD5(X + 1))
的概率与任意两个随机值{ Y
,Z
} 的概率相同。也就是说, P(MD5(Y)== MD5(Z))
= P(MD5(X)== MD5(X + 1))
= 1/(2 ^ 128)
对于任何值的X
,Y
和Z
。
将这与2 ^ 10个不同文件的情况结合起来,意味着通过存储文件大小,您最多只能获得10位表示项目是否不同的附加位数(再次假设您的文件对于所有值都是均匀分布的)。
因此,最好的方法是增加哈希函数返回的字节数,例如使用SHA-1 / 2,因为这将更有可能给您一个均匀分布的哈希值数据,而不是存储文件大小。
简而言之,如果MD5对于碰撞不够安全,则使用更强的哈希算法;如果更强的哈希算法速度太慢,则使用具有较低碰撞几率但速度较快的哈希算法,例如MD5,并使用较慢的哈希算法(如SHA-1或SHA256)来降低碰撞几率。但如果SHA256足够快且双倍空间不是问题,则应该使用SHA256。
根据您的哈希函数,但通常来说,相同大小但内容不同的文件产生的哈希值与大小不同的文件产生的哈希值相同的可能性较小。尽管如此,最好还是使用一个经过时间考验、空间更大的哈希函数(例如MD5而不是CRC32,或SHA1而不是MD5),而不是依赖自己的解决方案,比如存储文件大小。
哈希函数的设计是为了使得碰撞变得非常困难,否则它们就不会有效。
如果您遇到哈希冲突,那么这种情况的概率是1:可能哈希数量,这与文件大小无关。
如果您真的想要对哈希碰撞进行双重确认,可以为同一文件计算两个不同的哈希值 - 这比保存哈希值+文件大小更少出错。
1 - ((2^256)! / ((2^256) - 10^15)! ) / ((2^256)^(10^15))
来评估哈希冲突的概率,或者如果不太准确,则为1 - (1 - (10^15)/(2*2^256))^(10^15)
,这将给出4e-48
的碰撞机会。 - Li0liQ哈希值的大小与原始数据的大小无关。由于可能的哈希值数量是有限的,理论上两个不同大小的文件可能具有相同的哈希值。然而,这也意味着两个相同大小的文件可能具有相同的哈希值。