【问题标题】:Are hash collisions with different file sizes just as likely as same file size?具有不同文件大小的哈希冲突是否与相同文件大小一样可能?
【发布时间】:2010-03-14 15:31:01
【问题描述】:

我正在对大量文件进行哈希处理,为了避免哈希冲突,我还存储了文件的原始大小 - 这样,即使存在哈希冲突,文件大小也不太可能相同.这是声音(哈希冲突同样可能是任何大小),还是我需要另一条信息(如果冲突更有可能与原始的长度相同)。

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

【问题讨论】:

  • @bmargulies:我想我问的是一般情况,但我目前正在使用 SHA1,考虑切换到 SHA256 之类的东西。我只是想知道如果我还要键入文件大小,那么哈希需要多长时间。
  • 我也有同样的想法。我们需要对文件进行哈希处理,但我们需要最大速度(即 MD5),而且文件的大小差异很大。如果有可能在两种不同的文件大小上获得相同的 MD5 哈希,那么可能值得同时存储 MD5 + 大小以获得额外的安全层。我们正在对数百万(甚至十亿)文件进行散列处理,因此在我们的例子中,可能值得包括文件大小。

标签: hash hash-collision hash-code-uniqueness


【解决方案1】:

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

如果您假设您的文件均匀分布在固定的可用大小范围内,假设您的文件只有 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) 对于任何值XYZ

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

因此,最好的情况是为 N)。因此,您最好使用诸如 SHA-1/2 之类的东西来增加散列函数返回的字节数,因为与存储文件大小相比,这更有可能为您提供均匀分布的散列值数据。

简而言之,如果 MD5 不足以应对冲突,则使用更强的散列,如果更强的散列太慢,则使用 fast 冲突可能性低的散列,例如 MD5,以及然后使用 较慢 散列(例如 SHA-1 或 SHA256)来减少发生冲突的机会,但如果 SHA256 足够快并且双倍空间不是问题,那么您可能应该使用 SHA256。

【讨论】:

    【解决方案2】:

    取决于您的哈希函数,但一般来说,大小相同但内容不同的文件不太可能产生与大小不同的文件相同的哈希。尽管如此,与您自己的解决方案(例如存储文件大小)相比,简单地使用具有更大空间的经过时间考验的哈希(例如,MD5 代替 CRC32,或 SHA1 代替 MD5)可能会更干净。

    【讨论】:

    • 我正在考虑将哈希与文件大小结合使用 - 这样,即使发生冲突,我也会检查文件大小作为附加键,看看它是否真的相同文件。
    • 我明白你的目标是什么,但我的意思是,不要使用额外的 N 位来存储文件大小,而应该简单地使用一个哈希函数,其哈希值比你当前的大 N 位。这种方式更有可能产生更少的冲突,因为文件大小是任意的,而哈希函数是专门为避免冲突而设计的,因此这些额外的位将更好地利用这种方式。
    • 啊——这很有道理。我想我还是选择一个“更大”的哈希函数会更好,所以也许这就是我最终要做的。
    • @MaxShawabkeh 你有声明“相同大小但不同的文件比不同大小的文件产生相同哈希的可能性更小”的来源吗?我很好奇哈希是否像这样加权。
    【解决方案3】:

    无论原始数据的大小如何,散列的大小都是相同的。由于可能的哈希值数量有限,理论上两个不同大小的文件可能具有相同的哈希值。 但是,这意味着两个相同大小的文件也有可能具有相同的哈希值。

    【讨论】:

      【解决方案4】:

      哈希函数被设计成很难发生碰撞的方式,否则它们将不起作用。
      如果您的哈希冲突绝对令人难以置信大约为 1:number_of_possible_hashes 概率,这与文件大小无关。

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

      【讨论】:

      • 我实际上正在考虑这样做 - 请参阅我的另一个问题,stackoverflow.com/questions/2437345/…。我认为保存两个哈希值(如 SHA1 和 MD5)以及文件大小会使冲突变得非常不可能,我永远不必担心它。
      • 假设您正在使用 sha256,它为您提供 2^256 个可能的哈希值,并且您有数十亿个文件,每个文件有数百万个版本,每个版本为 1 000 000 000 * 1 000 000 接近 2^50,所以您是最终每个文件平均有 2^200 个可能的哈希值,没有任何冲突威胁。不是很大吗?更准确地说,您可以尝试通过计算1 - ((2^256)! / ((2^256) - 10^15)! ) / ((2^256)^(10^15)) 来评估哈希冲突的概率,或者如果不那么准确,1 - (1 - (10^15)/(2*2^256))^(10^15) 会给您4e-48 冲突的机会。
      【解决方案5】:

      密码散列系列(MD5、SHA-x 等)的全部意义在于使冲突极不可能发生。这个概念是,官方法律程序准备依赖于故意制造碰撞是不切实际的。所以,真的,在这些哈希的吊带上添加一条腰带是对空间和 CPU 时间的不良使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 2013-02-01
        • 2015-10-27
        相关资源
        最近更新 更多