【问题标题】:Can CRC32(C) ever return to 0?CRC32(C) 可以返回 0 吗?
【发布时间】:2014-10-23 18:54:57
【问题描述】:

我想知道 CRC32 sum 和 CRC32C 是否会返回 0?给定足够大的数据集,简单的答案将是“是”。但是,我想知道 CRC32C 标准中是否有任何规定可以明确防止这种情况发生。

这个用例是我需要能够检查远程文件是否为空,而我所拥有的只是它的 CRC32C 校验和。所以,换句话说,我可以推断如果 CRC32C 为 0,那么文件肯定是空的。

如果可能,请提供对定义该标准的任何参考。

【问题讨论】:

  • 您可以使用自己的校验和吗?在这种情况下,将零定义为仅用于空文件。如果哈希函数恰好产生零,只需将其设置为 1。
  • 您知道 CRC32 值但不知道文件的长度?嗯?
  • @usr CRC32C 算法针对速度进行了高度优化,并在 Intel CPU 上的硬件中实现。我需要它来进行线速计算,因此不能选择自定义实现。
  • @Kay 这只是一个例子。实际用例比这更复杂。
  • @dtoux 你只需要附加:if (crcValue == 0) crcValue = 1;。就是这样。

标签: crc crc32


【解决方案1】:

@Yanek 几乎完全正确。

只是为了好玩,这里有一个 CRC-32C 为零的五个字符序列:DYB|O。这是一个四字节的十六进制序列,给出零:ab 9b e0 9b。事实上,这是唯一可以这样做的四字节序列。没有三字节或更短的序列会给你零。这就是@Yanek 不完全正确的地方,因为对于三字节或更短的序列,零的可能性不大。在这些情况下,获得零的概率为零。

【讨论】:

  • 对于 3 字节输入,大约有 256 个输出的概率为零。据我所知,零输出没有什么特别之处。
  • 肯定还有很多。只有 2^24 个可能的 3 字节输入,因此必须有 2^32-2^24 == 4,278,190,080 个概率为零的输出。其余的概率为 2^-24。
  • 对,我错误地把数字相除而不是相减。
  • @MarkAdler 谢谢马克,这非常有用。
【解决方案2】:

0 与 CRC32 校验和的任何其他值一样可能。 CRC本质上是将整个输入(作为一个大二进制数)除以预选值的余数。如果输入恰好可以被该值整除,则余数以及 CRC 为零。

【讨论】:

  • 这是我目前的理解,但我仍然希望有人能证明我错了:-)
【解决方案3】:

这个怎么样,不是 32 位 CRC,但是:

1011 | 110011001010.000
       1011
       ----
        1111
        1011
        ----
         1001
         1011
         ----
           1000
           1011
           ----
             1110
             1011
             ----
              1011
              1011
              ----
                  0000 (...)
                  1011
                  ----
                  1011
                  1011
                  ----
                  0000

或者:

1100 | 11001010.000
       1100
       ----
           1010
           1100
           ----
            1100
            1100
            ----
            (...) 0

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 2011-04-26
    • 2010-12-14
    • 2016-03-03
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多