他们所说的“crc32”就是这个目录中的 CRC-32/BZIP2 。他们所说的“crc32b”是 PKZip CRC-32 (ITU V.42),通常简称为 CRC-32,因为它在该目录中。“crc32”和“crc32b”的这种用法显然是 PHP 作者发明的一种符号。
您可以在PHP 文档页面hash()
上找到一组示例哈希,用于. 在那里计算字符串“hello”的哈希值,并且可以根据实现进行检查。我链接的目录使用“123456789”进行检查。
您可以自己轻松计算 BZIP2 CRC。以下是一些 C 代码作为示例:
uint32_t crc32bzip2(uint32_t crc, void const *mem, size_t len) {
unsigned char const *data = mem;
if (data == NULL)
return 0;
crc = ~crc;
while (len--) {
crc ^= (unsigned)(*data++) << 24;
for (unsigned k = 0; k < 8; k++)
crc = crc & 0x80000000 ? (crc << 1) ^ 0x4c11db7 : crc << 1;
}
crc = ~crc;
return crc;
}
如果您为数据指针调用NULL
它,它将返回 CRC 的初始值,在这种情况下为零。然后您可以使用当前的 CRC 和用于更新 CRC 的字节调用它,它将返回生成的 CRC。
计算来自标准输入的字节的 CRC-32/BZIP2 的 Python 版本:
#!/usr/local/bin/python3
import sys
a = bytearray(sys.stdin.buffer.read())
crc = 0xffffffff
for x in a:
crc ^= x << 24;
for k in range(8):
crc = (crc << 1) ^ 0x04c11db7 if crc & 0x80000000 else crc << 1
crc = ~crc
crc &= 0xffffffff
print(hex(crc))
如果需要, crcany将生成更有效的基于表的版本(在 C 中)。