mirror of https://github.com/python/cpython
gh-111389: Add PyHASH_MULTIPLIER constant (#119214)
This commit is contained in:
parent
87939bd579
commit
f6da790122
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add :c:macro:`PyHASH_MULTIPLIER` constant: prime multiplier used in string
|
||||||
|
and various other hashes. Patch by Victor Stinner.
|
|
@ -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); \
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue