.. highlight:: c

PyHash API
----------

See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`.

.. c:type:: Py_hash_t

   Hash value type: signed integer.

   .. versionadded:: 3.2


.. c:type:: Py_uhash_t

   Hash value type: unsigned integer.

   .. versionadded:: 3.2


.. c:macro:: Py_HASH_ALGORITHM

   A numerical value indicating the algorithm for hashing of :class:`str`,
   :class:`bytes`, and :class:`memoryview`.

   The algorithm name is exposed by :data:`sys.hash_info.algorithm`.

   .. versionadded:: 3.4


.. c:macro:: Py_HASH_FNV
             Py_HASH_SIPHASH24
             Py_HASH_SIPHASH13

   Numerical values to compare to :c:macro:`Py_HASH_ALGORITHM` to determine
   which algorithm is used for hashing. The hash algorithm can be configured
   via the configure :option:`--with-hash-algorithm` option.

   .. versionadded:: 3.4
      Add :c:macro:`!Py_HASH_FNV` and :c:macro:`!Py_HASH_SIPHASH24`.

   .. versionadded:: 3.11
      Add :c:macro:`!Py_HASH_SIPHASH13`.


.. c:macro:: Py_HASH_CUTOFF

   Buffers of length in range ``[1, Py_HASH_CUTOFF)`` are hashed using DJBX33A
   instead of the algorithm described by :c:macro:`Py_HASH_ALGORITHM`.

   - A :c:macro:`!Py_HASH_CUTOFF` of 0 disables the optimization.
   - :c:macro:`!Py_HASH_CUTOFF` must be non-negative and less or equal than 7.

   32-bit platforms should use a cutoff smaller than 64-bit platforms because
   it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms
   and 5 on 32-bit platforms should provide a decent safety margin.

   This corresponds to the :data:`sys.hash_info.cutoff` constant.

   .. versionadded:: 3.4


.. c:macro:: PyHASH_MODULUS

   The `Mersenne prime <https://en.wikipedia.org/wiki/Mersenne_prime>`_ ``P = 2**n -1``,
   used for numeric hash scheme.

   This corresponds to the :data:`sys.hash_info.modulus` constant.

   .. versionadded:: 3.13


.. c:macro:: PyHASH_BITS

   The exponent ``n`` of ``P`` in :c:macro:`PyHASH_MODULUS`.

   .. versionadded:: 3.13


.. c:macro:: PyHASH_MULTIPLIER

   Prime multiplier used in string and various other hashes.

   .. versionadded:: 3.13


.. c:macro:: PyHASH_INF

   The hash value returned for a positive infinity.

   This corresponds to the :data:`sys.hash_info.inf` constant.

   .. versionadded:: 3.13


.. c:macro:: PyHASH_IMAG

   The multiplier used for the imaginary part of a complex number.

   This corresponds to the :data:`sys.hash_info.imag` constant.

   .. versionadded:: 3.13


.. c:type:: PyHash_FuncDef

   Hash function definition used by :c:func:`PyHash_GetFuncDef`.

   .. c:member:: Py_hash_t (*const hash)(const void *, Py_ssize_t)

      Hash function.

   .. c:member:: const char *name

      Hash function name (UTF-8 encoded string).

      This corresponds to the :data:`sys.hash_info.algorithm` constant.

   .. c:member:: const int hash_bits

      Internal size of the hash value in bits.

      This corresponds to the :data:`sys.hash_info.hash_bits` constant.

   .. c:member:: const int seed_bits

      Size of seed input in bits.

      This corresponds to the :data:`sys.hash_info.seed_bits` constant.

   .. versionadded:: 3.4


.. c:function:: PyHash_FuncDef* PyHash_GetFuncDef(void)

   Get the hash function definition.

   .. seealso::
      :pep:`456` "Secure and interchangeable hash algorithm".

   .. versionadded:: 3.4


.. c:function:: Py_hash_t Py_HashPointer(const void *ptr)

   Hash a pointer value: process the pointer value as an integer (cast it to
   ``uintptr_t`` internally). The pointer is not dereferenced.

   The function cannot fail: it cannot return ``-1``.

   .. versionadded:: 3.13

.. c:function:: Py_hash_t PyObject_GenericHash(PyObject *obj)

   Generic hashing function that is meant to be put into a type
   object's ``tp_hash`` slot.
   Its result only depends on the object's identity.

   .. impl-detail::
      In CPython, it is equivalent to :c:func:`Py_HashPointer`.

   .. versionadded:: 3.13
