我一直在尝试实现CRC32计算算法,如下所述: http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf;我对第3步感到困惑,从128位减少到64位。希望有人可以为我澄清这些步骤:
这些结果是否需要与起始128位的低64位进行异或,遵循前一次折叠的模式?图8中没有说明,我对图中数据的对齐感到困惑。
答案 0 :(得分:1)
图8显示最后的128位(工作余数x或缓冲区数据的最后128位)后跟32位附加零,因为crc32 =(msg(x)•x ^ 32)%p(x) 。所以你看到总共160位为64 | 32 | 32 | 32。
我的假设是高64位乘以K5,产生96位乘积。然后将该产品xor'ed到160位实体的低96位(记住低32位从32位附加零开始)。
然后将低96位的高32位(不是64位)乘以K6,产生64位乘积,该乘积与160位实体的低64位相乘。
然后,Barrett算法用于从160位实体的低64位产生32位CRC(其中低32位最初附加为零)。
为了解释Barrett算法,将64位视为被除数,将CRC多项式视为除数。然后余数=被除数 - (⌊被除数/除数⌋·除数)。而不是实际划分,使用pclmulqdq,并且⌊dividend / divisor⌋=(dividend·⌊2^ 64 / divisor⌋)>> 64。