我试图使用Python计算/生成一些随机字符串的CRC32散列,但它们与我从在线源生成的值不匹配。这是我在电脑上做的事情
>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829
另一种方法
>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829
上述结果相同的事实告诉我,我正确地调用了函数。但是,如果我访问以下在线资源
对于字符串“hello world”,它们都给出相同的值=b1d4025b
有人知道我需要做什么才能得到匹配的结果吗?
当我输入这个问题时,我突然想到我可能需要将Python结果转换成hex
>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'
不幸的是,这也没有帮助。:(一)
python似乎返回了一个有符号整数(因此是负数),而其他的python则返回了一个无符号整数。
我试过用一个2^32的模数,它给出的值和这些站点的值相同。
Python 2(与py3不同)正在执行有符号的32位CRC。
这些站点正在执行无符号的32位CRC。
否则,这些值是相同的,您可以从中看到:
从32位有符号转换为32位无符号的一种快速方法是:*
或十六进制:
& 0xFFFFFFFF
或% 0x100000000
或& (2**32-1)
或% (2**32)
等都是做同一个位旋转的等效方法;归根结底,你觉得哪个最可读。*这只适用于进行整数除法的语言,如Python(
-3 // 2 == -2
);而对于进行截断整数除法的语言,如Java(-3 / 2 == -1
),最终仍然会得到负数。在不需要除法和mod的语言中,比如C,所有的下注都是关闭的,但是在C中,你只需将字节转换成你想要的类型即可…zlib.crc32 documentation建议使用以下方法“在所有Python版本和平台上生成相同的数值”。
结果是
0xb1d4025b
如预期。相关问题 更多 >
编程相关推荐