Python 中的 CRC32(与 CRC32b)

Kel*_*ady 4 zlib python-3.x binascii

我正在尝试生成一些 crc32 哈希值,但似乎zlibbinascii使用 crc32b 算法,即使它们各自的函数很简单zlib.crc32binascii.crc32。我可以尝试其他用于哈希生成的 python 资源吗?有趣的是,我之前发现 R 的“digest”包也实现了 crc32b,但没有提到 crc32。

CRC32 和 CRC32b 含义的一些示例:

您可以在下拉列表中看到两者:http://www.md5calc.com/crc32

这里,CRC32b 位于右侧:https ://hash.online-convert.com/crc32-generator

这是一个以 php 为中心的讨论:What is the Difference Between crc32 and crc32b?

这里我们可以看到python正在实现CRC32b:如何用Python计算CRC32以匹配在线结果?

谢谢

Mar*_*ler 6

他们所说的“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;
}
Run Code Online (Sandbox Code Playgroud)

如果您用数据指针调用它NULL,它将返回 CRC 的初始值,在本例中为零。然后您可以使用当前 CRC 和用于更新 CRC 的字节来调用它,它将返回结果 CRC。

计算来自 stdin 的字节的 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))
Run Code Online (Sandbox Code Playgroud)

如果需要, crcany将生成更高效的基于表的版本(C 语言)。

  • 请注意,“PHP crc32 输出采用反向字节顺序”([来源](https://www.php.net/manual/en/function.hash-file.php#104836))。这是一个基于 @mark-adler 答案的 Python 实现,它反转了输出字节顺序:https://chezsoi.org/shaarli/?U7admg (2认同)