我正在散列大量文件,并且为了避免散列冲突,我还存储了文件的原始大小 - 这样,即使存在哈希冲突,文件大小也不太可能相同。这是声音(哈希冲突同样可能是任何大小),或者我是否需要另一条信息(如果碰撞更可能与原始信息的长度相同)。
或者,更一般地说:无论原始文件大小如何,每个文件是否都可能产生特定的哈希?
答案 0 :(得分:7)
通常编写散列函数以在所有结果桶中均匀分布数据。
如果您假设您的文件均匀分布在固定的可用大小范围内,请假设您的文件只有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
的任何值,{1}} = Y
。
将此与2 ^ 10个不同的文件相结合意味着通过存储文件大小,您最多可获得额外的10位,表示项目是否不同(同样,假设您的文件均匀分布在所有值中)
所以你所做的就是为< = N个字节的唯一值添加另外N个字节的存储空间(它永远不会是> N)。因此,使用诸如SHA-1/2之类的东西来增加哈希函数返回的字节要好得多,因为这样可能比存储文件大小更能为您提供均匀分布的哈希值数据。
简而言之,如果MD5不足以进行冲突,则使用更强的哈希值,如果更强的哈希值太慢,则使用 fast 哈希,碰撞机会较低,如MD5,以及然后使用较慢的哈希(如SHA-1或SHA256)来减少冲突的可能性,但如果SHA256足够快并且加倍空间不是问题,那么您可能应该使用SHA256。
答案 1 :(得分:5)
取决于您的散列函数,但通常,大小相同但内容不同的文件不太可能生成与大小不同的文件相同的散列。尽管如此,简单地使用经过时间考验的具有更大空间的哈希(例如MD5而不是CRC32,或SHA1而不是MD5)可能比在您自己的解决方案(如存储文件大小)上下注更简洁。
答案 2 :(得分:1)
哈希函数的设计方式很难得到碰撞,否则它们就无效了
如果你有一个绝对令人难以置信的哈希冲突大约1:number_of_possible_hashes概率没有说明文件大小。
如果你真的希望对哈希冲突有双重肯定,你可以为同一个文件计算两个不同的哈希值 - 它比保存哈希+文件大小更不容易出错。
答案 3 :(得分:1)
无论原始数据的大小如何,哈希的大小都是相同的。由于只有有限数量的可能散列,理论上可能两个具有不同大小的文件可能具有相同的散列。 但是,这意味着两个相同大小的文件也可能具有相同的哈希值。
答案 4 :(得分:0)
密码哈希(MD5,SHA-x等)系列的重点是使冲突不太可能发生。这个概念是官方的法律程序准备依赖于故意制造碰撞是不切实际的。所以,实际上,在这些哈希的吊带上添加腰带是一个很糟糕的空间和CPU时间。