我想从 ASCII 字符串创建一个 32 位数字。 CRC32 算法正是我正在寻找的,但我无法使用它,因为它需要的表太大了(它适用于资源非常稀有的嵌入式系统)。
那么:对于快速且精简的 CRC 算法有什么建议吗?当冲突的可能性比原始 CRC32 更高时,这并不重要。
CRC 实现使用表来提高速度。它们不是必需的。
这是一个简短的 CRC32,使用 Castagnoli 多项式(与 Intel crc32 指令使用的相同)或以太网多项式(与 zip、gzip 等中使用的相同)。
#include <stddef.h>
#include <stdint.h>
/* CRC-32C (iSCSI) polynomial in reversed bit order. */
#define POLY 0x82f63b78
/* CRC-32 (Ethernet, ZIP, etc.) polynomial in reversed bit order. */
/* #define POLY 0xedb88320 */
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
}
return ~crc;
}
最初的crc
值应该为零。可以使用数据块连续调用该例程来更新 CRC。您可以展开内部循环以提高速度,尽管您的编译器可能会为您执行此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)