我应该如何处理应用程序中的校验和冲突?

问题描述 投票:0回答:4

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

  1. 我应该在多大程度上担心哈希冲突?

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

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

language-agnostic hash hash-collision
4个回答
4
投票

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

SHA1 比 MD5 具有更大的输出空间(并且已知的攻击也更少),因此它绝对不是一个更糟糕的选择。如果您担心有人主动碰撞您的哈希值,也许 SHA 的最新变体(例如 SHA-256)可能是个好主意。


2
投票

任意两个随机选择的比特流的哈希值之间发生冲突的几率与哈希值所代表的不同状态的数量成反比。因此,64 位哈希对

2 ** 64
状态进行编码,并且任何文件对都有可能发生
1 / (2**64)
冲突。但您确实关心一组(大)文件发生冲突的可能性,因此您需要进行“生日悖论”计算,插入成对碰撞的概率和预期的文件数量。

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


0
投票

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

var a = 1; var b = 2;

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

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

当您处理随机生成的哈希时,会发生哈希冲突,由于随机的未指定输入,哈希冲突可能会发生冲突,尽管可能性很小。

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


0
投票

为了避免哈希比较上的冲突,您可以在检测到相似的哈希后,向两个文件字节添加一些字节,再次生成哈希并进行另一次比较。

© www.soinside.com 2019 - 2024. All rights reserved.