CRC32(C) 可以返回 0 吗?

Posted

技术标签:

【中文标题】CRC32(C) 可以返回 0 吗?【英文标题】:Can CRC32(C) ever return to 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;。就是这样。 【参考方案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

【讨论】:

以上是关于CRC32(C) 可以返回 0 吗?的主要内容,如果未能解决你的问题,请参考以下文章

CRC32可以用作散列函数吗?

可以使用 CRC32C 作为基础构造一个“好”的哈希函数吗?

根据CRC32码,可以判断是否同一文件?

c语言 CRC的检验方式 我想问一下。这下面的C语言返回的CRC的值是啥。他有他的公式是怎么样的

用 C 语言在消息的开头使用 CRC 哈希计算 CRC32

一个简短的CRC32计算程序 C语言