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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
可以使用 CRC32C 作为基础构造一个“好”的哈希函数吗?