Commit 224a599c authored by Barry Warsaw's avatar Barry Warsaw

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

  object's custom `__hash__()` method.
parent 48830035
...@@ -583,11 +583,16 @@ are always available. They are listed here in alphabetical order. ...@@ -583,11 +583,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])
......
...@@ -1264,10 +1264,21 @@ Basic customization ...@@ -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
......
...@@ -210,6 +210,9 @@ Tests ...@@ -210,6 +210,9 @@ Tests
Documentation Documentation
------------- -------------
- Issue #18440: Clarify that `hash()` can truncate the value returned from an
object's custom `__hash__()` method.
- Issue #17953: Mention that you shouldn't replace sys.modules and deleting key - Issue #17953: Mention that you shouldn't replace sys.modules and deleting key
items will cause Python to not be happy. items will cause Python to not be happy.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment