@@ -8230,6 +8230,39 @@ _shuffle_bits(Py_uhash_t h)
82308230 return ((h ^ 89869747UL ) ^ (h << 16 )) * 3644798167UL ;
82318231}
82328232
8233+ // Compute hash((key, value)).
8234+ // Code copied from tuple_hash().
8235+ static Py_hash_t
8236+ frozendict_pair_hash (Py_hash_t key_hash , PyObject * value )
8237+ {
8238+ assert (key_hash != -1 );
8239+
8240+ const Py_ssize_t len = 2 ;
8241+ Py_uhash_t acc = _PyTuple_HASH_XXPRIME_5 ;
8242+
8243+ Py_uhash_t lane = key_hash ;
8244+ acc += lane * _PyTuple_HASH_XXPRIME_2 ;
8245+ acc = _PyTuple_HASH_XXROTATE (acc );
8246+ acc *= _PyTuple_HASH_XXPRIME_1 ;
8247+
8248+ lane = PyObject_Hash (value );
8249+ if (lane == (Py_uhash_t )- 1 ) {
8250+ return -1 ;
8251+ }
8252+ acc += lane * _PyTuple_HASH_XXPRIME_2 ;
8253+ acc = _PyTuple_HASH_XXROTATE (acc );
8254+ acc *= _PyTuple_HASH_XXPRIME_1 ;
8255+
8256+ /* Add input length, mangled to keep the historical value of hash(()). */
8257+ acc += len ^ (_PyTuple_HASH_XXPRIME_5 ^ 3527539UL );
8258+
8259+ if (acc == (Py_uhash_t )- 1 ) {
8260+ acc = 1546275796 ;
8261+ }
8262+ return acc ;
8263+ }
8264+
8265+
82338266// Code copied from frozenset_hash()
82348267static Py_hash_t
82358268frozendict_hash (PyObject * op )
@@ -8243,20 +8276,15 @@ frozendict_hash(PyObject *op)
82438276 PyDictObject * mp = _PyAnyDict_CAST (op );
82448277 Py_uhash_t hash = 0 ;
82458278
8246- PyObject * key , * value ; // borrowed refs
8279+ PyObject * value ; // borrowed ref
82478280 Py_ssize_t pos = 0 ;
8248- while (PyDict_Next (op , & pos , & key , & value )) {
8249- Py_hash_t key_hash = PyObject_Hash (key );
8250- if (key_hash == -1 ) {
8251- return -1 ;
8252- }
8253- hash ^= _shuffle_bits (key_hash );
8254-
8255- Py_hash_t value_hash = PyObject_Hash (value );
8256- if (value_hash == -1 ) {
8281+ Py_hash_t key_hash ;
8282+ while (_PyDict_Next (op , & pos , NULL , & value , & key_hash )) {
8283+ Py_hash_t pair_hash = frozendict_pair_hash (key_hash , value );
8284+ if (pair_hash == -1 ) {
82578285 return -1 ;
82588286 }
8259- hash ^= _shuffle_bits (value_hash );
8287+ hash ^= _shuffle_bits (pair_hash );
82608288 }
82618289
82628290 /* Factor in the number of active entries */
0 commit comments