为什么
from zlib import crc32
import numpy as np
x = crc32(np.int64(0))
print(x)
输出是1696784233,这怎么可能,因为我认为CRC给出了一些带有参数的生成多项式的提醒,但由于参数是0,输出怎么会不是0?
这是因为 CRC-32 的 zlib 版本专门设计用于处理前导零(以及校验和后插入的任何尾随零)。根据维基百科:
移位寄存器可以用 1 而不是 0 来初始化。这相当于先反转消息的前 n n 位,然后再将其输入算法。
使用此方法的原因是,未修改的 CRC 无法区分仅前导零数量不同的两个消息,因为前导零不会影响 M(x) 的值。完成此反转后,CRC 会区分此类消息。
CRC 在附加到消息流之前可能会被反转。虽然未修改的 CRC 区分具有不同数量的尾随零的消息 M(x),但它不会检测附加在 CRC 余数本身之后的尾随零。这是因为所有有效码字都是 G(x) 的倍数,因此该码字的 x 倍也是倍数。 (事实上,这正是上述第一个变体起作用的原因。)
您可以手动撤消该操作以查看
zlib.crc32(numpy.int64(0), 0xFF_FF_FF_FF) == 0xFF_FF_FF_FF
,事实上 zlib.crc32(bytes(i), 0xFF_FF_FF_FF) == 0xFF_FF_FF_FF
对于任何自然数 i
。