Hash 不同文件大小的哈希冲突是否与相同文件大小的哈希冲突一样可能?

Hash 不同文件大小的哈希冲突是否与相同文件大小的哈希冲突一样可能?,hash,hash-collision,hash-code-uniqueness,Hash,Hash Collision,Hash Code Uniqueness,我正在散列大量文件,为了避免散列冲突,我还存储了文件的原始大小——这样,即使有散列冲突,文件大小也不太可能相同。这是声音(散列冲突同样可能是任意大小的),还是我需要另一条信息(如果冲突更可能是与原始冲突相同的长度) 或者,更一般地说:无论原始文件大小如何,每个文件都可能生成特定的哈希吗?取决于您的哈希函数,但一般来说,大小相同但内容不同的文件生成相同哈希的可能性比大小不同的文件小。不过,简单地使用经过时间测试的具有更大空间的散列(例如,MD5而不是CRC32,或者SHA1而不是MD5)可能比押注

我正在散列大量文件,为了避免散列冲突,我还存储了文件的原始大小——这样,即使有散列冲突,文件大小也不太可能相同。这是声音(散列冲突同样可能是任意大小的),还是我需要另一条信息(如果冲突更可能是与原始冲突相同的长度)


或者,更一般地说:无论原始文件大小如何,每个文件都可能生成特定的哈希吗?

取决于您的哈希函数,但一般来说,大小相同但内容不同的文件生成相同哈希的可能性比大小不同的文件小。不过,简单地使用经过时间测试的具有更大空间的散列(例如,MD5而不是CRC32,或者SHA1而不是MD5)可能比押注于您自己的解决方案(如存储文件大小)更干净。

散列函数的设计方式很难获得冲突,否则它们将无效。
如果你有散列冲突,这是绝对令人难以置信的,大约1:number\u of\u可能的\u散列概率,与文件大小无关


如果您真的想对哈希冲突有双重保证,可以为同一个文件计算两个不同的哈希值-这比保存哈希值+文件大小更容易出错。

哈希值的大小与原始数据的大小无关。由于可能的散列数有限,理论上两个大小不同的文件可能具有相同的散列数然而,这意味着同样大小的两个文件也可能具有相同的散列。

加密散列(MD5、SHA-x等)家族的全部要点是使冲突不太可能发生。这一概念是,官方法律程序准备依赖于故意制造碰撞是不切实际的。因此,实际上,在这些散列的吊带中添加一条带子是对空间和CPU时间的一种不好的利用。

散列函数通常被编写为在所有结果桶中均匀分布数据

如果您假设您的文件在固定的可用大小范围内均匀分布,那么假设您的文件只有1024(2^10)个均匀分布的不同大小。存储文件大小最多只能通过不同文件大小的数量减少冲突的可能性

注意:我们可以假设它是2^32,分布均匀,大小不同,但它仍然不会改变数学的其余部分

通常认为,在MD5上发生碰撞的一般概率(例如)为
1/(2^128)

除非hash函数中专门内置了另一种说法。给定任何有效的
X
,使得
P(MD5(X)=MD5(X+1))的概率保持与任意两个随机值{
Y
Z
}相同,也就是说
P(MD5(Y)==MD5(Z))
=
P(MD5(X)==MD5(X+1))
=
1/(2^128)
Y
Z

将其与2^10个不同的文件相结合意味着,通过存储文件大小,您最多可以获得额外的10位,这表示项目是否不同(同样,这是假设您的文件对于所有值都是均匀分布的)

因此,在最好的情况下,您所做的就是为(N)添加另一个N字节的存储。因此,最好使用诸如SHA-1/2之类的工具来增加哈希函数返回的字节数,因为这样比存储文件大小更有可能为您提供均匀分布的哈希值数据


简而言之,如果MD5对冲突不够好,请使用更强的散列,如果更强的散列速度太慢,请使用低冲突概率的快速散列,如MD5,然后使用较慢的散列,如SHA-1或SHA256,以减少冲突的机会,但是,如果SHA256足够快,并且倍增的空间不是问题,那么您可能应该使用SHA256。

@b argulies:我想我是一般性地问,但我目前正在使用SHA1,考虑切换到类似SHA256的东西。我只是想知道,如果我还要键入文件大小,哈希需要多长时间。我有完全相同的想法。我们需要散列文件,但我们需要最大速度(即MD5),并且文件大小差异很大。如果可以在两个不同的文件大小上获得相同的MD5哈希值,那么为了额外的安全层,存储这两个MD5+大小可能是值得的。我们正在对数百万(甚至十亿)个文件进行哈希运算,因此在我们的例子中,可能值得包括文件大小。我实际上正在考虑这样做-参见我的另一个问题。我认为保存两个哈希(如SHA1和MD5)以及文件大小,将使碰撞在天文学上不太可能发生,因此我不必担心。假设您使用的是sha256,它提供了2^256个可能的哈希值,并且您有十亿个文件,每个文件有一百万个版本,每个版本为10000000*1000000,近似于2^50,因此每个文件的平均可能哈希值为2^200没有任何碰撞威胁。是不是太大了?更准确地说,您可以尝试通过计算
1-((2^256)!/((2^256)-10^15)!/((2^256)^(10^15))
来评估散列冲突的概率,或者如果不太准确
1-(1-(10^15)/(2*2^256))^(10^15)
这将给您带来冲突的机会。我正在考虑将哈希与文件大小结合使用-这样,即使是在不太可能发生冲突的情况下,我也会检查文件大小作为附加键,看看它是否真的是同一个文件。我明白您的目标,但我的观点是,不需要额外的N位来存储文件大小,而应该只使用哈希值为N的哈希函数