CRC32 就是 CRC 多项式的模 2 除法,也叫异或除法,把除法的规则变为异或,其它一样,但一个长的数据直接异或除法还是有难度,于是就有了查表法,查表法的原理网上也有很多文章,下面是自己的理解,想分而治之把数据分成多个块,用查表法,就要用下面的公式:
D = (a xor b) xor_div c;
a = (A xor_mul c) xor AQ;
b = (B xor_mul c) xor BQ;
其中 :
- xor 表示异或,
- xor_div 表示异或除法,
- xor_mul 表示异或乘法,
- xor_rem 表示异或除法余数
A,B 分别为 a, b 异或除以 c 的商,
而 AQ,BQ 分别为 a, b 异或除以 c 的余数,
数据分成多个块,结果要对,便要证明下式:
(AQ xor b) xor_div c , (a xor b) xor_div c 两者的异或除法余数相等
上面符号看起来很别扭,把符号变成函数应该会舒服很多:
D = xor_div(xor (a , b), c);
a = xor (xor_mul (A, c), AQ);
b = xor (xor_mul (B, c), BQ);
xor_rem (xor_div (xor (AQ , b))) == xor_rem (xor_div (xor (a, b), c));
或者为 lisp 样式
D = (xor_div(xor a b) c);
a = (xor (xor_mul A c) AQ);
b = (xor (xor_mul B c) BQ);
(xor_rem (xor_div (xor AQ b))) == (xor_rem (xor_div (xor a b) c));
至于证明这个等式,我不会。