mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-111389: replace deprecated occurrences of _PyHASH_* macros (#141236)
This commit is contained in:
parent
3ce2d57b2f
commit
ae1f435071
6 changed files with 41 additions and 41 deletions
|
|
@ -29,7 +29,7 @@ static Py_ssize_t hashstats[Py_HASH_STATS_MAX + 1] = {0};
|
|||
#endif
|
||||
|
||||
/* For numeric types, the hash of a number x is based on the reduction
|
||||
of x modulo the prime P = 2**_PyHASH_BITS - 1. It's designed so that
|
||||
of x modulo the prime P = 2**PyHASH_BITS - 1. It's designed so that
|
||||
hash(x) == hash(y) whenever x and y are numerically equal, even if
|
||||
x and y have different types.
|
||||
|
||||
|
|
@ -52,8 +52,8 @@ static Py_ssize_t hashstats[Py_HASH_STATS_MAX + 1] = {0};
|
|||
|
||||
If the result of the reduction is infinity (this is impossible for
|
||||
integers, floats and Decimals) then use the predefined hash value
|
||||
_PyHASH_INF for x >= 0, or -_PyHASH_INF for x < 0, instead.
|
||||
_PyHASH_INF and -_PyHASH_INF are also used for the
|
||||
PyHASH_INF for x >= 0, or -PyHASH_INF for x < 0, instead.
|
||||
PyHASH_INF and -PyHASH_INF are also used for the
|
||||
hashes of float and Decimal infinities.
|
||||
|
||||
NaNs hash with a pointer hash. Having distinct hash values prevents
|
||||
|
|
@ -65,16 +65,16 @@ static Py_ssize_t hashstats[Py_HASH_STATS_MAX + 1] = {0};
|
|||
efficiently, even if the exponent of the binary or decimal number
|
||||
is large. The key point is that
|
||||
|
||||
reduce(x * y) == reduce(x) * reduce(y) (modulo _PyHASH_MODULUS)
|
||||
reduce(x * y) == reduce(x) * reduce(y) (modulo PyHASH_MODULUS)
|
||||
|
||||
provided that {reduce(x), reduce(y)} != {0, infinity}. The reduction of a
|
||||
binary or decimal float is never infinity, since the denominator is a power
|
||||
of 2 (for binary) or a divisor of a power of 10 (for decimal). So we have,
|
||||
for nonnegative x,
|
||||
|
||||
reduce(x * 2**e) == reduce(x) * reduce(2**e) % _PyHASH_MODULUS
|
||||
reduce(x * 2**e) == reduce(x) * reduce(2**e) % PyHASH_MODULUS
|
||||
|
||||
reduce(x * 10**e) == reduce(x) * reduce(10**e) % _PyHASH_MODULUS
|
||||
reduce(x * 10**e) == reduce(x) * reduce(10**e) % PyHASH_MODULUS
|
||||
|
||||
and reduce(10**e) can be computed efficiently by the usual modular
|
||||
exponentiation algorithm. For reduce(2**e) it's even better: since
|
||||
|
|
@ -92,7 +92,7 @@ _Py_HashDouble(PyObject *inst, double v)
|
|||
|
||||
if (!isfinite(v)) {
|
||||
if (isinf(v))
|
||||
return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
|
||||
return v > 0 ? PyHASH_INF : -PyHASH_INF;
|
||||
else
|
||||
return PyObject_GenericHash(inst);
|
||||
}
|
||||
|
|
@ -109,19 +109,19 @@ _Py_HashDouble(PyObject *inst, double v)
|
|||
and hexadecimal floating point. */
|
||||
x = 0;
|
||||
while (m) {
|
||||
x = ((x << 28) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - 28);
|
||||
x = ((x << 28) & PyHASH_MODULUS) | x >> (PyHASH_BITS - 28);
|
||||
m *= 268435456.0; /* 2**28 */
|
||||
e -= 28;
|
||||
y = (Py_uhash_t)m; /* pull out integer part */
|
||||
m -= y;
|
||||
x += y;
|
||||
if (x >= _PyHASH_MODULUS)
|
||||
x -= _PyHASH_MODULUS;
|
||||
if (x >= PyHASH_MODULUS)
|
||||
x -= PyHASH_MODULUS;
|
||||
}
|
||||
|
||||
/* adjust for the exponent; first reduce it modulo _PyHASH_BITS */
|
||||
e = e >= 0 ? e % _PyHASH_BITS : _PyHASH_BITS-1-((-1-e) % _PyHASH_BITS);
|
||||
x = ((x << e) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - e);
|
||||
/* adjust for the exponent; first reduce it modulo PyHASH_BITS */
|
||||
e = e >= 0 ? e % PyHASH_BITS : PyHASH_BITS-1-((-1-e) % PyHASH_BITS);
|
||||
x = ((x << e) & PyHASH_MODULUS) | x >> (PyHASH_BITS - e);
|
||||
|
||||
x = x * sign;
|
||||
if (x == (Py_uhash_t)-1)
|
||||
|
|
|
|||
|
|
@ -1587,10 +1587,10 @@ get_hash_info(PyThreadState *tstate)
|
|||
} while(0)
|
||||
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(8 * sizeof(Py_hash_t)));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromSsize_t(_PyHASH_MODULUS));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(_PyHASH_INF));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromSsize_t(PyHASH_MODULUS));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(PyHASH_INF));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(0)); // This is no longer used
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(_PyHASH_IMAG));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(PyHASH_IMAG));
|
||||
SET_HASH_INFO_ITEM(PyUnicode_FromString(hashfunc->name));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(hashfunc->hash_bits));
|
||||
SET_HASH_INFO_ITEM(PyLong_FromLong(hashfunc->seed_bits));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue