我已经看到了相同基本 CRC-32 算法的许多不同实现,如下所示:
int remain;
int sbox[SIZESBOX];
int dividend;
int bit;
for(dividend = 0; dividend < SIZESBOX; dividend++)
{
remain = dividend << 24;
for(bit = 0; bit < 8; bit++)
{
if(remain & TOPBIT)
{
remain = (remain << 1) ^ POLYNOMIAL;
}
else
{
remain = (remain << 1);
}
}
sbox[dividend] = remain;
}
其中一些在进入 sbox 之前对股息进行异或。其他人在进入位循环之前进行异或,其他人使用按位反射。
对于给定的用例,CRC-32 的不同实现之间是否存在我需要考虑的差异?使用按位反射或 XOR-OUT 的一种是否一定比不使用的更好?为什么会有这么多不同的实现呢?