CRC算法请教
我在处理GPT和LVM相关的功能时发现这两者使用的CRC32算法的代码并不一致,
GPT下是
__efi_crc32(const void *buf, unsigned long len, uint32_t seed)
{
unsigned long i;
register uint32_t crc32val;
const unsigned char *s = buf;
crc32val = seed;
for (i = 0; i < len; i ++)
{
crc32val =
crc32_tab[(crc32val ^ s[i]) & 0xff] ^
(crc32val >> 8);
}
return crc32val;
}
而在LVM下是
uint32_t calc_crc(uint32_t initial, const uint8_t *buf, uint32_t size)
{
const uint32_t *start = (const uint32_t *) buf;
const uint32_t *end = (const uint32_t *) (buf + (size & 0xfffffffc));
uint32_t crc = initial;
/* Process 4 bytes per iteration */
while (start < end) {
crc = crc ^ xlate32(*start++);
crc = crctab[crc & 0xff] ^ crc >> 8;
crc = crctab[crc & 0xff] ^ crc >> 8;
crc = crctab[crc & 0xff] ^ crc >> 8;
crc = crctab[crc & 0xff] ^ crc >> 8;
}
/* Process any bytes left over */
buf = (const uint8_t *) start;
size = size & 0x3;
while (size--) {
crc = crc ^ *buf++;
crc = crctab[crc & 0xff] ^ crc >> 8;
}
return crc;
}
请教一下算法达人,这两种算法各自用在什么地方?