为什么crc32(0) = 1696784233

问题描述 投票:0回答:1

为什么

    from zlib import crc32
    import numpy as np

    x = crc32(np.int64(0))
    print(x)

输出是1696784233,这怎么可能,因为我认为CRC给出了一些带有参数的生成多项式的提醒,但由于参数是0,输出怎么会不是0?

binary crc32
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.