【发布时间】:2014-12-13 07:02:24
【问题描述】:
CRC32和CRC32C有什么区别?知道CRC32很久了,今天才听说CRC32C。它们基本上是相同的方法吗(即,对于给定的数据,两者都产生相同的哈希值)?
【问题讨论】:
CRC32和CRC32C有什么区别?知道CRC32很久了,今天才听说CRC32C。它们基本上是相同的方法吗(即,对于给定的数据,两者都产生相同的哈希值)?
【问题讨论】:
在 zip 和许多其他地方找到的 CRC32 使用多项式 0x04C11DB7;它的反向形式 0xEDB88320 可能更广为人知,经常出现在 little-endian 实现中。
CRC32C 使用不同的多项式(0x1EDC6F41,反向 0x82F63B78),但其他计算是相同的。结果自然不同。这也称为 Castagnoli CRC32,在较新的 Intel CPU 中最为明显,它可以在 3 个周期内计算完整的 32 位 CRC 步骤。这就是 CRC32C 变得越来越流行的原因,因为它允许高级实现在每个周期有效处理一个 32 位字,尽管存在三个周期的延迟(通过并行处理 3 个数据流并使用线性代数来组合结果)。
【讨论】:
crc32 指令可以处理 8 个字节(64 位),因此其 3 周期延迟,顺序吞吐量约为 2.67 字节/周期,并且最佳的 3x 并行版本接近 8 字节/周期。