我的应用程序的一部分存储文件。因为我们可能会添加许多相同的文件,所以我首先保留每个文件的哈希值。如果两个文件具有相同的哈希值,那么我们抛弃一个,并且对该文件的两个“引用”都指向同一个物理文件。
我应该多担心哈希冲突?
在发生碰撞的情况下,我该怎么办?到目前为止,我的代码的关键在于不存在具有相同散列的两个不同文件。如果现在发生碰撞,我的应用程序会丢弃一个合法的不同文件,并指向具有相同哈希值的文件。
我应该使用MD5以外的东西吗? SHA-1的碰撞率是否更好?
答案 0 :(得分:4)
除非你处于一些非常重要的应用程序中,否则不要担心哈希冲突。它们是如此罕见以至于许多事情都假设它们不会发生,如果这种假设最终只是假一次就会发生灾难性的事情。
SHA1的输出空间比MD5大(并且已知的攻击次数也较少),所以它绝对不是一个更糟糕的选择。如果你害怕有人主动碰撞你的哈希值,那么后来的SHA变种,比如SHA-256,可能是个好主意。
答案 1 :(得分:2)
任意两个随机选择的比特流的散列之间发生冲突的可能性与散列表示的不同状态的数量成反比。因此,64位散列会对2 ** 64
个状态进行编码,并且对于任何文件对都有1 / (2**64)
次冲突的可能性。但是你真的担心在(大)文件集上发生碰撞的可能性,所以你需要进行“生日悖论”计算,插入成对碰撞的概率和预期的文件数。
但我认为最重要的是丢弃文件而不进行比较是不安全的事情,即使数字表明碰撞的可能性很小。
答案 2 :(得分:0)
在提供的场景中,您永远不必担心。除非它们相同,否则2个不同的文档不可能具有相同的校验和。想象一下:
var a = 1; var b = 2;
b + 3 = 5; //真的耶! a + 3!= 5; //只要var a不等于2
,就不会发生碰撞var'a'具有除2之外的任何值永远不能计算为5,因此不可能发生冲突。由于您正在使用(或应该使用)单向校验和散列算法,因此生成的散列将始终取决于其输入
当您处理随机生成的哈希值时会发生哈希冲突,因为它们的随机未指定输入可能会发生冲突,但不太可能发生冲突。
请注意,我绝不会推断单向散列算法是通过简单的加法完成的。我只是使用add作为一个简单的例子,基于简单的概念,即它们都采用一组值并根据它们输出不同的设置值。