Зачем 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
Другие вопросы по тегам