mirror of
https://github.com/python/cpython.git
synced 2025-08-24 02:35:59 +00:00
Issue #8188: Introduce a new scheme for computing hashes of numbers
(instances of int, float, complex, decimal.Decimal and fractions.Fraction) that makes it easy to maintain the invariant that hash(x) == hash(y) whenever x and y have equal value.
This commit is contained in:
parent
03721133a6
commit
dc787d2055
14 changed files with 566 additions and 137 deletions
|
@ -403,12 +403,12 @@ complex_str(PyComplexObject *v)
|
|||
static long
|
||||
complex_hash(PyComplexObject *v)
|
||||
{
|
||||
long hashreal, hashimag, combined;
|
||||
hashreal = _Py_HashDouble(v->cval.real);
|
||||
if (hashreal == -1)
|
||||
unsigned long hashreal, hashimag, combined;
|
||||
hashreal = (unsigned long)_Py_HashDouble(v->cval.real);
|
||||
if (hashreal == (unsigned long)-1)
|
||||
return -1;
|
||||
hashimag = _Py_HashDouble(v->cval.imag);
|
||||
if (hashimag == -1)
|
||||
hashimag = (unsigned long)_Py_HashDouble(v->cval.imag);
|
||||
if (hashimag == (unsigned long)-1)
|
||||
return -1;
|
||||
/* Note: if the imaginary part is 0, hashimag is 0 now,
|
||||
* so the following returns hashreal unchanged. This is
|
||||
|
@ -416,10 +416,10 @@ complex_hash(PyComplexObject *v)
|
|||
* compare equal must have the same hash value, so that
|
||||
* hash(x + 0*j) must equal hash(x).
|
||||
*/
|
||||
combined = hashreal + 1000003 * hashimag;
|
||||
if (combined == -1)
|
||||
combined = -2;
|
||||
return combined;
|
||||
combined = hashreal + _PyHASH_IMAG * hashimag;
|
||||
if (combined == (unsigned long)-1)
|
||||
combined = (unsigned long)-2;
|
||||
return (long)combined;
|
||||
}
|
||||
|
||||
/* This macro may return! */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue