3

我有一部分存储文件的应用程序。因为我们可能会添加许多相同的文件,所以我首先保留每个文件的哈希值。如果两个文件具有相同的哈希值,那么我们会丢弃一个,并且对该文件的两个“引用”都指向同一个物理文件。

  1. 我应该担心多少哈希冲突?

  2. 如果发生碰撞我该怎么办?到目前为止,我的代码的全部症结取决于没有两个具有相同哈希的不同文件。如果现在发生冲突,我的应用程序会抛出一个合法的不同文件并指向具有相同哈希的文件。

  3. 我应该使用 MD5 以外的东西吗?SHA-1 是否有更好的碰撞率?

4

3 回答 3

4

除非您在一些非常关键的应用程序中,否则不要担心哈希冲突。它们是如此罕见,以至于许多事情都认为它们不会发生,如果这种假设最终只是一次错误,那么这些事情就会发生灾难性的事情。

SHA1 的输出空间比 MD5 大(已知的攻击也更少),所以它绝对不是一个更糟糕的选择。如果你害怕有人主动碰撞你的哈希值,也许以后的 SHA 变体,比如 SHA-256,可能是个好主意。

于 2009-12-14T21:17:30.367 回答
2

任何两个随机选择的比特流的散列之间发生冲突的机会与散列所代表的不同状态的数量成反比。因此,64 位散列对状态进行编码,并且对于任何一对文件2 ** 64都有可能发生冲突。1 / (2**64)但是您真的很担心在一组(大)文件上发生冲突的可能性,因此您需要进行“生日悖论”计算,插入成对冲突的概率和预期的文件数量。

但我认为底线是不进行比较就丢弃文件是不安全的事情,即使数字表明发生冲突的可能性很小。

于 2009-12-14T21:49:41.860 回答
0

在提供的场景中,您永远不必担心。除非它们相同,否则 2 个不同的文档不可能具有相同的校验和。想象一下:

变量 a = 1; 变量 b = 2;

b + 3 = 5;// 真的耶!a + 3 != 5; // 只要 var a 不等于 2,就不可能发生冲突

具有除 2 以外的任何值的 var 'a' 永远无法计算为 5,因此不可能发生冲突。由于您正在使用(或应该使用)单向校验和哈希算法,因此生成的哈希将始终取决于其输入

当您处理随机生成的散列时,会发生散列冲突,由于它们的随机未指定输入可能会发生冲突,但可能性很小。

请注意,我绝不会推断散列算法的一种方式是通过简单的加法来完成的。我只是使用加法作为一个简单的例子,它基于一个简单的概念,即它们都采用一组值并根据它们输出不同的设置值。

于 2014-02-02T01:27:27.317 回答