gh-111389: Add PyHASH_MULTIPLIER constant (#119214)

This commit is contained in:
Victor Stinner 2024-05-21 19:51:51 +02:00 committed by GitHub
parent 87939bd579
commit f6da790122
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 16 additions and 7 deletions

View File

@ -29,6 +29,12 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`.
.. versionadded:: 3.13 .. versionadded:: 3.13
.. c:macro:: PyHASH_MULTIPLIER
Prime multiplier used in string and various other hashes.
.. versionadded:: 3.13
.. c:macro:: PyHASH_INF .. c:macro:: PyHASH_INF
The hash value returned for a positive infinity. The hash value returned for a positive infinity.

View File

@ -3,7 +3,7 @@
#endif #endif
/* Prime multiplier used in string and various other hashes. */ /* Prime multiplier used in string and various other hashes. */
#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ #define PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */
/* Parameters used for the numeric hash implementation. See notes for /* Parameters used for the numeric hash implementation. See notes for
_Py_HashDouble in Python/pyhash.c. Numeric hashes are based on _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on
@ -17,9 +17,10 @@
#define PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) #define PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1)
#define PyHASH_INF 314159 #define PyHASH_INF 314159
#define PyHASH_IMAG _PyHASH_MULTIPLIER #define PyHASH_IMAG PyHASH_MULTIPLIER
/* Aliases kept for backward compatibility with Python 3.12 */ /* Aliases kept for backward compatibility with Python 3.12 */
#define _PyHASH_MULTIPLIER PyHASH_MULTIPLIER
#define _PyHASH_BITS PyHASH_BITS #define _PyHASH_BITS PyHASH_BITS
#define _PyHASH_MODULUS PyHASH_MODULUS #define _PyHASH_MODULUS PyHASH_MODULUS
#define _PyHASH_INF PyHASH_INF #define _PyHASH_INF PyHASH_INF

View File

@ -0,0 +1,2 @@
Add :c:macro:`PyHASH_MULTIPLIER` constant: prime multiplier used in string
and various other hashes. Patch by Victor Stinner.

View File

@ -2020,7 +2020,7 @@ code_hash(PyCodeObject *co)
Py_uhash_t uhash = 20221211; Py_uhash_t uhash = 20221211;
#define SCRAMBLE_IN(H) do { \ #define SCRAMBLE_IN(H) do { \
uhash ^= (Py_uhash_t)(H); \ uhash ^= (Py_uhash_t)(H); \
uhash *= _PyHASH_MULTIPLIER; \ uhash *= PyHASH_MULTIPLIER; \
} while (0) } while (0)
#define SCRAMBLE_IN_HASH(EXPR) do { \ #define SCRAMBLE_IN_HASH(EXPR) do { \
Py_hash_t h = PyObject_Hash(EXPR); \ Py_hash_t h = PyObject_Hash(EXPR); \

View File

@ -1496,7 +1496,7 @@ address_to_hash(void *ptr) {
uintptr_t addr = (uintptr_t)ptr; uintptr_t addr = (uintptr_t)ptr;
for (int i = 0; i < SIZEOF_VOID_P; i++) { for (int i = 0; i < SIZEOF_VOID_P; i++) {
uhash ^= addr & 255; uhash ^= addr & 255;
uhash *= (uint64_t)_PyHASH_MULTIPLIER; uhash *= (uint64_t)PyHASH_MULTIPLIER;
addr >>= 8; addr >>= 8;
} }
return uhash; return uhash;

View File

@ -263,12 +263,12 @@ fnv(const void *src, Py_ssize_t len)
x ^= (Py_uhash_t) *p << 7; x ^= (Py_uhash_t) *p << 7;
while (blocks--) { while (blocks--) {
PY_UHASH_CPY(block.bytes, p); PY_UHASH_CPY(block.bytes, p);
x = (_PyHASH_MULTIPLIER * x) ^ block.value; x = (PyHASH_MULTIPLIER * x) ^ block.value;
p += SIZEOF_PY_UHASH_T; p += SIZEOF_PY_UHASH_T;
} }
/* add remainder */ /* add remainder */
for (; remainder > 0; remainder--) for (; remainder > 0; remainder--)
x = (_PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *p++; x = (PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *p++;
x ^= (Py_uhash_t) len; x ^= (Py_uhash_t) len;
x ^= (Py_uhash_t) _Py_HashSecret.fnv.suffix; x ^= (Py_uhash_t) _Py_HashSecret.fnv.suffix;
if (x == (Py_uhash_t) -1) { if (x == (Py_uhash_t) -1) {

View File

@ -312,7 +312,7 @@ traceback_hash(traceback_t *traceback)
/* code based on tuplehash() of Objects/tupleobject.c */ /* code based on tuplehash() of Objects/tupleobject.c */
Py_uhash_t x, y; /* Unsigned for defined overflow behavior. */ Py_uhash_t x, y; /* Unsigned for defined overflow behavior. */
int len = traceback->nframe; int len = traceback->nframe;
Py_uhash_t mult = _PyHASH_MULTIPLIER; Py_uhash_t mult = PyHASH_MULTIPLIER;
frame_t *frame; frame_t *frame;
x = 0x345678UL; x = 0x345678UL;