计算大型CRC32的正确方法是什么

计算大型CRC32的正确方法是什么,c,x86-64,sse,crc32,C,X86 64,Sse,Crc32,这篇文章描述了如何使用现代x86-64处理器中的内置CRC32指令计算最大1024字节的CRC32。但是,我需要计算超过1024字节的CRC32。计算每个1024字节块的CRC32并最终求和是正确的方法,还是不正确?如果是这样,正确的方法是什么?引用你文章中提到的 而不是使用传统的 线性方法,我们使用更快的方法来分割任意长度 缓冲到若干较小的固定大小的段,计算上的CRC 这些片段平行排列,然后进行重组步骤 使用段的部分CRC计算有效CRC 而且 CRC的最终重组增加了开销,可以 通过Nehale

这篇文章描述了如何使用现代x86-64处理器中的内置CRC32指令计算最大1024字节的CRC32。但是,我需要计算超过1024字节的CRC32。计算每个1024字节块的CRC32并最终求和是正确的方法,还是不正确?如果是这样,正确的方法是什么?

引用你文章中提到的

而不是使用传统的 线性方法,我们使用更快的方法来分割任意长度 缓冲到若干较小的固定大小的段,计算上的CRC 这些片段平行排列,然后进行重组步骤 使用段的部分CRC计算有效CRC

而且

CRC的最终重组增加了开销,可以 通过Nehalem微体系结构上的查找表实现 演示如何使用尽可能少的表格进行此操作,同时给出 在各种尺寸上都有出色的整体性能PCLMULQDQ Westmile微体系结构中的指令允许高效 在没有查找表的情况下重组CRC。各种方法包括 本文用真实的代码示例详细解释。

因此,您需要详细研究这篇论文:
使用CRC32指令对iSCSI多项式进行快速CRC计算

不,仅添加不会起作用

您链接的文章告诉我们如何做到这一点:

一次计算的CRC输出用作计算的初始CRC 下一次计算[…]


为了解决最终结果大于
0xffffffff
的问题,只需在最终计算后执行
crc32=~crc32&0xffffff

您似乎已经非常感兴趣地阅读了这篇文章:)!好的,这就是将上一个CRC传递给下一个调用的问题。没问题!这比Pavan描述的技术要简单,但当然,如果这样做,那么就不能并行化不同的块,它们必须按顺序处理。这就是说,我个人从未觉得有必要并行化校验和计算,一个核对任何人都应该足够了;-)对CRC的工作原理和计算方法有很好的解释。