我想知道CRC32校验和,特别是CRC32C是否会返回0?简单的答案是,如果数据集足够大,那么会返回0。然而,我想知道是否有任何在CRC32C标准中的规定可以明确防止这种情况发生。
这个用例是,我需要检查远程文件是否为空,我只有它的CRC32C校验和。换句话说,如果CRC32C为0,那么文件是否保证为空。
如果可能的话,请提供定义此内容的标准参考。
@Yanek的说法几乎完全正确。
只是为了好玩,这里有一个五个字符的序列 DYB|O
,它的CRC-32C值为零。这里还有一个以十六进制表示的四字节序列,其值也为零: ab 9b e0 9b
。 实际上,这是唯一能够产生零的四字节序列。对于一个、两个或三个字节序列,没有任何能够产生零的序列。这就是@Yanek不完全正确的地方,在这些情况下,获得零的概率为零。
在CRC32校验和中,0的概率与任何其他值相等。CRC本质上是将整个输入(作为一个大二进制数)除以预选值的余数。如果输入恰好可被该值整除,则余数和因此CRC为零。
这个怎么样,虽然不是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
if (crcValue == 0) crcValue = 1;
,就可以了。这就是全部内容。 - usr