Зачем zlib.crc32 в python нужно побитовое И, чтобы считаться "стабильным"?
Изменено в версии 3.0: всегда возвращает значение без знака. Чтобы сгенерировать одно и то же числовое значение для всех версий и платформ Python, используйте crc32 (data) & 0xffffffff.
Но почему мы должны использовать побитовое и с двоичным числом, установленным на все 1? Разве результат не будет одинаковым независимо (как в любом двоичном числе BITWISE ANDED со всеми 1 всегда будет одинаковое двоичное число)? Эта, казалось бы, произвольная деталь делает меня неудобным.
1 ответ
Побитовый &
вызывает преобразование значения в целое число без знака. Рассмотрим, например:
>>> -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