Я видел много разных реализаций одного и того же базового алгоритма 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;
}
Некоторые из них выполняют операцию XOR над дивидендом перед тем, как попасть в sbox. Другие XOR перед входом в битовый цикл, а другие используют побитовое отражение.
Существуют ли различия, которые мне необходимо учитывать между различными реализациями CRC-32 для данного варианта использования? Является ли тот, который использует побитовое отражение или XOR-OUT, обязательно лучше, чем тот, который этого не делает? Почему существует так много разных реализаций?