如何用Python计算CRC32以匹配在线结果?

时间:2015-05-07 04:54:04

标签: python crc32

我正在尝试使用Python计算/生成一些随机字符串的CRC32哈希值,但它们与我在线源生成的值不匹配。这是我在电脑上做的事情,

>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829

另一种方法,

>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829

以上结果相同的事实告诉我,我正在正确调用该函数。但是,如果我转到以下在线资源,

对于字符串“hello-world”,它们都给出相同的值= b1d4025b

有谁知道我需要做什么,以获得匹配的结果?

当我输入这个问题时,我发现我可能需要将我的Python结果转换为十六进制,

>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'

不幸的是,这也没有帮助。 :(

3 个答案:

答案 0 :(得分:24)

Python正在执行带符号的32位CRC。

这些网站正在进行无符号32位CRC。

除此之外,其他值相同,如下所示:

>>> 0x100000000 - 0xb1d4025b == 0x4e2bfda5
True

从32位有符号转换为32位无符号的快速方法是: *

>>> -1311505829 % (1<<32)
2983461467

或者,以十六进制:

>>> hex(-1311505829 % (1<<32))
'0xb1d4025b'

& 0xFFFFFFFF% 0x100000000& (2**32-1)% (2**32)等等都是进行相同比特操作的等效方式;它归结为哪一个你觉得最具可读性。

*这仅适用于执行整数除法的语言,如Python(-3 // 2 == -2);在截断整数除法的语言中,如Java(-3 / 2 == -1),你仍然会得到一个负数。并且在那些甚至不需要除法和mod的语言中,如C一样,所有的赌注都是关闭的 - 但在C中,你只需将字节转换为你想要的类型......

答案 1 :(得分:14)

zlib.crc32 documentation建议使用以下方法“在所有Python版本和平台上生成相同的数值”。

import zlib
hex(zlib.crc32(b'hello-world') & 0xffffffff)

结果是0xb1d4025b符合预期。

答案 2 :(得分:4)

似乎python返回一个有符号整数(因此是负数),而其他人返回一个无符号整数。

我尝试使用2 ^ 32的模数,它给出了与这些网站相同的值。

>>> hex(zlib.crc32('hello-world')% 2**32))                          
'0xb1d4025b'
相关问题