Mercurial > cpython-lru_cache-weakref
diff Objects/complexobject.c @ 61873:0bc8ffe6ba9a
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.
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Sun, 23 May 2010 13:33:13 +0000 |
| parents | d6016fa58df6 |
| children | eafe07d40eb7 |
line wrap: on
line diff
--- a/Objects/complexobject.c Sun May 23 13:26:48 2010 +0000 +++ b/Objects/complexobject.c Sun May 23 13:33:13 2010 +0000 @@ -403,12 +403,12 @@ 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 @@ * 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! */
