Python中的CRC32(vs CRC32b)

凯莉·布雷迪

我想产生一些CRC32哈希值,但似乎zlibbinascii使用crc32b算法,即使它们各自的功能仅仅是zlib.crc32binascii.crc32我可以尝试其他用于散列生成的python资源吗?有趣的是,我以前发现R的“摘要”包也实现了crc32b,而没有提到crc32。

我所说的CRC32和CRC32b的一些示例:

在这里您可以在下拉菜单中看到两者:http : //www.md5calc.com/crc32

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

这是有关该区域的以php为中心的讨论:crc32和crc32b有什么区别?

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

谢谢

马克·阿德勒

他们所谓的“ 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;
}

如果使用withNULL作为数据指针,它将返回CRC的初始值,在这种情况下为零。然后,您可以使用当前的CRC和用于更新CRC的字节来调用它,它将返回生成的CRC。

一个Python版本,可计算来自stdin的字节的CRC-32 / BZIP2:

#!/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语言)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章