为什么 python 的 zlib.crc32 需要按位与被认为是 "stable"?

Why does python's zlib.crc32 need a bitwise AND to be considered "stable"?

Source

Changed in version 3.0: Always returns an unsigned value. To generate the same numeric value across all Python versions and platforms, use crc32(data) & 0xffffffff.

但为什么我们需要使用位和二进制数设置为全 1?无论如何结果都不会相同(因为在任何二进制数中,所有 1 的 BITWISE ANDED 总是相同的二进制数)?这个看似武断的细节让我很不舒服。

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

>>> -2 & 0xffffffff
4294967294

根据您引用的评论,在 3.0 中 Python 更改为 always return 一个无符号值,而在以前的版本中 crc32() 方法可能 return 编辑了一个带符号的值。

例如,在 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