为什么python的zlib.crc32需要按位AND来考虑"稳定"?

时间:2016-04-28 02:14:01

标签: python python-3.x crc32

Source

  

在3.0版中更改:始终返回无符号值。要在所有Python版本和平台上生成相同的数值,请使用 crc32(data)& 0xffffffff的

但为什么我们需要使用按位和二进制数设置为所有1?不管结果是否相同(如任何二进制数字BITWISE ANDED,所有1' s将始终是相同的二进制数)?这看似随意的细节让我感到不舒服。

1 个答案:

答案 0 :(得分:3)

按位&强制将值转换为无符号整数。例如,考虑一下:

>>> -2 & 0xffffffff
4294967294

根据您引用的注释,在3.0中Python已更改为始终返回无符号值,而在以前的版本中,crc32()方法可能返回了有符号值。

例如,在Python 2.7.11中:

>>> crc32('the quick brown fox')
-1849621814

但是在Python 3.4.3中:

>>> crc32(b'the quick brown fox')
2445345482

所以你在这里得到不同的值,但是如果在Python 2.7中你按位执行,你得到的值与Python 3.4相同:

>>> crc32('the quick brown fox') & 0xffffffff
2445345482