【问题标题】:CRC32 vs CRC32C?CRC32 与 CRC32C?
【发布时间】:2014-12-13 07:02:24
【问题描述】:

CRC32和CRC32C有什么区别?知道CRC32很久了,今天才听说CRC32C。它们基本上是相同的方法吗(即,对于给定的数据,两者都产生相同的哈希值)?

【问题讨论】:

    标签: hash checksum


    【解决方案1】:

    在 zip 和许多其他地方找到的 CRC32 使用多项式 0x04C11DB7;它的反向形式 0xEDB88320 可能更广为人知,经常出现在 little-endian 实现中。

    CRC32C 使用不同的多项式(0x1EDC6F41,反向 0x82F63B78),但其他计算是相同的。结果自然不同。这也称为 Castagnoli CRC32,在较新的 Intel CPU 中最为明显,它可以在 3 个周期内计算完整的 32 位 CRC 步骤。这就是 CRC32C 变得越来越流行的原因,因为它允许高级实现在每个周期有效处理一个 32 位字,尽管存在三个周期的延迟(通过并行处理 3 个数据流并使用线性代数来组合结果)。

    【讨论】:

    • 有没有办法在 CRC32 和 CRC32C 之间进行转换?看一些kernel patches with comments,有可能但没有解释。
    • @jww:如果有可能,那么它必须至少与将连续块的 CRC 拼接在一起一样复杂(例如计算“虚拟原像”)。我从未见过这样的算法,尽管它的实用性很明显(例如使用 CRC32C 的硬件指令并将结果转换为标准 (zip) CRC32)。快速获得答案的最佳方法是将其作为一个问题单独发布。我的 +1 是给定的。 ;-)
    • 次要:crc32 指令可以处理 8 个字节(64 位),因此其 3 周期延迟,顺序吞吐量约为 2.67 字节/周期,并且最佳的 3x 并行版本接近 8 字节/周期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2011-07-31
    • 2020-12-21
    • 2015-11-20
    • 2014-01-24
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多