# HG changeset patch # Parent 1ad3d8d82b18c5a0326ea739e7aaf1590543a896 Issue #22341: Drop Python 2 workaround and document CRC initial value diff -r 1ad3d8d82b18 Doc/library/binascii.rst --- a/Doc/library/binascii.rst Mon Mar 30 11:54:05 2015 +0200 +++ b/Doc/library/binascii.rst Mon Mar 30 12:22:33 2015 +0000 @@ -118,7 +118,8 @@ .. function:: crc32(data[, crc]) - Compute CRC-32, the 32-bit checksum of data, starting with an initial crc. This + Compute CRC-32, the 32-bit checksum of *data*, starting with + the given *crc*. The default initial value is zero. The algorithm is consistent with the ZIP file checksum. Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm. Use as follows:: @@ -126,15 +127,13 @@ print(binascii.crc32(b"hello world")) # Or, in two pieces: crc = binascii.crc32(b"hello") - crc = binascii.crc32(b" world", crc) & 0xffffffff + crc = binascii.crc32(b" world", crc) print('crc32 = {:#010x}'.format(crc)) -.. note:: - To generate the same numeric value across all Python versions and - platforms use crc32(data) & 0xffffffff. If you are only using - the checksum in packed binary format this is not necessary as the - return value is the correct 32bit binary representation - regardless of sign. + .. versionchanged:: 3.0 + The result is always unsigned. + To generate the same numeric value across all Python versions and + platforms, use ``crc32(data) & 0xffffffff``. .. function:: b2a_hex(data) diff -r 1ad3d8d82b18 Doc/library/zlib.rst --- a/Doc/library/zlib.rst Mon Mar 30 11:54:05 2015 +0200 +++ b/Doc/library/zlib.rst Mon Mar 30 12:22:33 2015 +0000 @@ -30,23 +30,20 @@ .. function:: adler32(data[, value]) - Computes a Adler-32 checksum of *data*. (An Adler-32 checksum is almost as - reliable as a CRC32 but can be computed much more quickly.) If *value* is - present, it is used as the starting value of the checksum; otherwise, a fixed - default value is used. This allows computing a running checksum over the + Computes an Adler-32 checksum of *data*. (An Adler-32 checksum is almost as + reliable as a CRC32 but can be computed much more quickly.) The + result is an unsigned 32-bit integer. If *value* is present, it is used + as the starting value of the checksum; otherwise, a default value + of 1 is used. This allows computing a running checksum over the concatenation of several inputs. The algorithm is not cryptographically strong, and should not be used for authentication or digital signatures. Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm. - Always returns an unsigned 32-bit integer. - -.. note:: - To generate the same numeric value across all Python versions and - platforms use adler32(data) & 0xffffffff. If you are only using - the checksum in packed binary format this is not necessary as the - return value is the correct 32bit binary representation - regardless of sign. + .. versionchanged:: 3.0 + Always returns an unsigned value. + To generate the same numeric value across all Python versions and + platforms, use ``adler32(data) & 0xffffffff``. .. function:: compress(data[, level]) @@ -97,23 +94,19 @@ single: Cyclic Redundancy Check single: checksum; Cyclic Redundancy Check - Computes a CRC (Cyclic Redundancy Check) checksum of *data*. If *value* is - present, it is used as the starting value of the checksum; otherwise, a fixed - default value is used. This allows computing a running checksum over the + Computes a CRC (Cyclic Redundancy Check) checksum of *data*. + The result is an unsigned 32-bit integer. If *value* is present, it is + used as the starting value of the checksum; otherwise, a default value + of zero is used. This allows computing a running checksum over the concatenation of several inputs. The algorithm is not cryptographically strong, and should not be used for authentication or digital signatures. Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm. - Always returns an unsigned 32-bit integer. - - .. note:: - + .. versionchanged:: 3.0 + Always returns an unsigned value. To generate the same numeric value across all Python versions and - platforms, use ``crc32(data) & 0xffffffff``. If you are only using - the checksum in packed binary format this is not necessary as the - return value is the correct 32-bit binary representation - regardless of sign. + platforms, use ``crc32(data) & 0xffffffff``. .. function:: decompress(data[, wbits[, bufsize]]) diff -r 1ad3d8d82b18 Lib/gzip.py --- a/Lib/gzip.py Mon Mar 30 11:54:05 2015 +0200 +++ b/Lib/gzip.py Mon Mar 30 12:22:33 2015 +0000 @@ -243,7 +243,7 @@ def _init_write(self, filename): self.name = filename - self.crc = zlib.crc32(b"") & 0xffffffff + self.crc = zlib.crc32(b"") self.size = 0 self.writebuf = [] self.bufsize = 0 @@ -275,7 +275,7 @@ self.fileobj.write(fname + b'\000') def _init_read(self): - self.crc = zlib.crc32(b"") & 0xffffffff + self.crc = zlib.crc32(b"") self.size = 0 def _read_exact(self, n): @@ -344,7 +344,7 @@ if length > 0: self.fileobj.write(self.compress.compress(data)) self.size += length - self.crc = zlib.crc32(data, self.crc) & 0xffffffff + self.crc = zlib.crc32(data, self.crc) self.offset += length return length @@ -470,7 +470,7 @@ return True def _add_read_data(self, data): - self.crc = zlib.crc32(data, self.crc) & 0xffffffff + self.crc = zlib.crc32(data, self.crc) offset = self.offset - self.extrastart self.extrabuf = self.extrabuf[offset:] + data self.extrasize = self.extrasize + len(data) diff -r 1ad3d8d82b18 Lib/tarfile.py --- a/Lib/tarfile.py Mon Mar 30 11:54:05 2015 +0200 +++ b/Lib/tarfile.py Mon Mar 30 12:22:33 2015 +0000 @@ -456,13 +456,7 @@ self.fileobj.write(self.buf) self.buf = b"" if self.comptype == "gz": - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - self.fileobj.write(struct.pack("