【问题标题】:How to calculate CRC32 of two CRC32?如何计算两个CRC32的CRC32?
【发布时间】:2020-04-03 07:44:18
【问题描述】:

假设我们有两条不同消息的 CRC32 值 (Cycle Redundancy Check)。如何计算它们共同的CRC32? 例如:

  • “你好”的 CRC32 = 3610a686
  • “世界”的 CRC32 = 3a771143
  • “helloworld”的 CRC32 = f9eb20ad

【问题讨论】:

  • 请参考*.com/questions/2587766/…,看看它是否回答了您的问题?
  • @KartikChauhan,这个问题描述了CRC32的构造。我想知道我是否可以快速计算他们常见的CRC32,我想使用计数的第一个CRC32和第二个CRC32来计算这个。

标签: checksum crc crc32


【解决方案1】:

组合两个(或更多)块的单独计算的 CRC 以获得这些块的连接的 CRC 是可能的,但这并不简单,并且涉及相当多的线性代数。

zlib 包含一个函数crc32_combine(),它可以为您完成工作,并且许多相当好的(和相当最新的)库都提供了类似的功能。 Mark Adler(是的,同名校验和的 Mark Adler)在主题 CRC Calculation Of A Mostly Static Data Stream 中发布了 a good explanation

英特尔文档Fast CRC Computation for iSCSI Polynomial Using CRC32 Instruction 详细解释了该过程。

【讨论】:

  • 最可怕的是500 line assembly program,它使用 pclmulqdq 和 xmm 寄存器在大多数 X86 处理器上以超过 3 GB/秒的速度计算 CRC,
【解决方案2】:

CRC32 使用 0xFFFFFFFF 的初始值,并通过与 0xFFFFFFFF 异或(或不使用)来补充 CRC。如果你有一个修改过的 CRC32 将这些值作为参数,那么对“hello”的第一次调用将使用初始值 = 0xFFFFFFFF, xorout = 0x00000000,例如 CRC = CRC32X(0xFFFFFFFF, 0x00000000, "hello", 5),其中第三个参数是指向字符串的指针,第四个参数是字符串中的字节数。第二次调用是 CRC32X(CRC, 0xFFFFFFFF, "world", 5),其中 CRC 是第一次调用返回的值。

【讨论】: