From: Raymond Hettinger Date: Fri, 7 Aug 2015 07:43:39 +0000 (-0700) Subject: Move the active entry multiplication to later in the hash calculation X-Git-Tag: v3.6.0a1~1818 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4148195c45862fb62df97943591e9771b5638156;p=thirdparty%2FPython%2Fcpython.git Move the active entry multiplication to later in the hash calculation --- diff --git a/Objects/setobject.c b/Objects/setobject.c index 0a065cc27ddc..03bb230961cc 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -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;