summaryrefslogtreecommitdiff
path: root/Objects/complexobject.c
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2010-05-23 13:33:13 +0000
committerMark Dickinson <dickinsm@gmail.com>2010-05-23 13:33:13 +0000
commitdc57afcc7e7f4450d0ba47b67b6feec201c13a94 (patch)
tree404fd0cd146b197c674fec619c6085027b56cb5d /Objects/complexobject.c
parentdd3845b54f74aad33483ce3390e67648e2fa3d7a (diff)
downloadcpython-dc57afcc7e7f4450d0ba47b67b6feec201c13a94.tar.gz
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.
Diffstat (limited to 'Objects/complexobject.c')
-rw-r--r--Objects/complexobject.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 9e1e217856..7594c886ec 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -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! */