- Issue #18440: Clarify that hash() can truncate the value returned from an

object's custom `__hash__()` method.
This commit is contained in:
Barry Warsaw 2013-07-15 15:21:41 -04:00
commit 4958f714bd
3 changed files with 27 additions and 8 deletions

View file

@ -587,11 +587,16 @@ are always available. They are listed here in alphabetical order.
.. function:: hash(object) .. function:: hash(object)
Return the hash value of the object (if it has one). Hash values are integers. Return the hash value of the object (if it has one). Hash values are
They are used to quickly compare dictionary keys during a dictionary lookup. integers. They are used to quickly compare dictionary keys during a
Numeric values that compare equal have the same hash value (even if they are of dictionary lookup. Numeric values that compare equal have the same hash
different types, as is the case for 1 and 1.0). value (even if they are of different types, as is the case for 1 and 1.0).
.. note::
For object's with custom :meth:`__hash__` methods, note that :func:`hash`
truncates the return value based on the bit width of the host machine.
See :meth:`__hash__` for details.
.. function:: help([object]) .. function:: help([object])

View file

@ -1264,10 +1264,21 @@ Basic customization
Called by built-in function :func:`hash` and for operations on members of Called by built-in function :func:`hash` and for operations on members of
hashed collections including :class:`set`, :class:`frozenset`, and hashed collections including :class:`set`, :class:`frozenset`, and
:class:`dict`. :meth:`__hash__` should return an integer. The only required :class:`dict`. :meth:`__hash__` should return an integer. The only
property is that objects which compare equal have the same hash value; it is required property is that objects which compare equal have the same hash
advised to somehow mix together (e.g. using exclusive or) the hash values for value; it is advised to somehow mix together (e.g. using exclusive or) the
the components of the object that also play a part in comparison of objects. hash values for the components of the object that also play a part in
comparison of objects.
.. note::
:func:`hash` truncates the value returned from an object's custom
:meth:`__hash__` method to the size of a :c:type:`Py_ssize_t`. This is
typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds. If an
object's :meth:`__hash__` must interoperate on builds of different bit
sizes, be sure to check the width on all supported builds. An easy way
to do this is with
``python -c "import sys; print(sys.hash_info.width)"``
If a class does not define an :meth:`__eq__` method it should not define a If a class does not define an :meth:`__eq__` method it should not define a
:meth:`__hash__` operation either; if it defines :meth:`__eq__` but not :meth:`__hash__` operation either; if it defines :meth:`__eq__` but not

View file

@ -581,6 +581,9 @@ Tests
Documentation Documentation
------------- -------------
- Issue #18440: Clarify that `hash()` can truncate the value returned from an
object's custom `__hash__()` method.
- Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs. - Issue #17844: Add links to encoders and decoders for bytes-to-bytes codecs.
- Issue #14097: improve the "introduction" page of the tutorial. - Issue #14097: improve the "introduction" page of the tutorial.