]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Move the active entry multiplication to later in the hash calculation
authorRaymond Hettinger <python@rcn.com>
Fri, 7 Aug 2015 07:43:39 +0000 (00:43 -0700)
committerRaymond Hettinger <python@rcn.com>
Fri, 7 Aug 2015 07:43:39 +0000 (00:43 -0700)
Objects/setobject.c

index 0a065cc27ddc27697f2949a48f5995e2b513dd0f..03bb230961cc0f79ff70eb9ca0fcb2700fa4886c 100644 (file)
@@ -760,15 +760,12 @@ static Py_hash_t
 frozenset_hash(PyObject *self)
 {
     PySetObject *so = (PySetObject *)self;
-    Py_uhash_t hash = 1927868237UL;
+    Py_uhash_t hash = 0;
     setentry *entry;
 
     if (so->hash != -1)
         return so->hash;
 
-    /* Initial dispersion based on the number of active entries */
-    hash *= (Py_uhash_t)PySet_GET_SIZE(self) + 1;
-
     /* Xor-in shuffled bits from every entry's hash field because xor is
        commutative and a frozenset hash should be independent of order.
 
@@ -790,6 +787,9 @@ frozenset_hash(PyObject *self)
     if ((so->fill - so->used) & 1)
         hash ^= _shuffle_bits(-1);
 
+    /* Factor in the number of active entries */
+    hash ^= ((Py_uhash_t)PySet_GET_SIZE(self) + 1) * 1927868237UL;
+
     /* Disperse patterns arising in nested frozensets */
     hash = hash * 69069U + 907133923UL;