CRC32 vs CRC32C?

70

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

1个回答

82

在zip和许多其他地方发现的CRC32使用的是多项式0x04C11DB7;它的反转形式0xEDB88320可能更为人所知,因为它经常出现在小端实现中。

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


5
有没有办法在CRC32和CRC32C之间进行转换?看一些带注释的内核补丁,可能是可以的,但没有解释。 - jww
2
@jww:如果可能的话,它必须至少像将连续块的CRC拼接在一起(如计算“虚拟预映像”)一样复杂。我从未见过这样的算法,尽管它的实用性是显而易见的(例如使用CRC32C的硬件指令并将结果转换为标准(zip)CRC32)。最快获得答案的方法是将其作为一个问题发布。我的+1是肯定的。;-) - DarthGizka
4
注:crc32 指令可以处理 8 字节(64 位)的数据,其延迟为 3 个时钟周期,因此顺序吞吐量约为每个时钟周期 ~2.67 字节,而最优的 3 倍并行版本接近每个时钟周期处理 8 字节。 - ZachB
1
值得注意的是,该指令是SSE4.2的一部分。 - Hi-Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接