Skip to content

Commit 43c18e9

Browse files
committed
Fix hash(frozendict)
1 parent 56e3253 commit 43c18e9

2 files changed

Lines changed: 20 additions & 26 deletions

File tree

Objects/dictobject.c

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7878,34 +7878,29 @@ static Py_hash_t
78787878
frozendict_hash(PyObject *op)
78797879
{
78807880
PyFrozenDictObject *self = _PyFrozenDictObject_CAST(op);
7881-
Py_uhash_t acc = self->ma_hash;
7882-
if (acc != (Py_uhash_t)-1) {
7883-
return acc;
7881+
Py_hash_t hash = self->ma_hash;
7882+
if (hash != -1) {
7883+
return hash;
78847884
}
7885-
acc = _PyTuple_HASH_XXPRIME_5;
78867885

7887-
PyObject *key = NULL, *value = NULL;
7888-
Py_ssize_t pos = 0;
7889-
Py_hash_t key_hash;
7890-
while (_PyDict_Next(op, &pos, &key, &value, &key_hash)) {
7891-
acc += (Py_uhash_t)key_hash * _PyTuple_HASH_XXPRIME_2;
7892-
acc = _PyTuple_HASH_XXROTATE(acc);
7893-
acc *= _PyTuple_HASH_XXPRIME_1;
7894-
7895-
Py_INCREF(value);
7896-
Py_uhash_t value_hash = PyObject_Hash(value);
7897-
Py_DECREF(value);
7898-
if (value_hash == (Py_uhash_t)-1) {
7899-
return -1;
7900-
}
7886+
PyObject *items = _PyDictView_New(op, &PyDictItems_Type);
7887+
if (items == NULL) {
7888+
return -1;
7889+
}
7890+
PyObject *frozenset = PyFrozenSet_New(items);
7891+
Py_DECREF(items);
7892+
if (frozenset == NULL) {
7893+
return -1;
7894+
}
79017895

7902-
acc += value_hash * _PyTuple_HASH_XXPRIME_2;
7903-
acc = _PyTuple_HASH_XXROTATE(acc);
7904-
acc *= _PyTuple_HASH_XXPRIME_1;
7896+
hash = PyObject_Hash(frozenset);
7897+
Py_DECREF(frozenset);
7898+
if (hash == -1) {
7899+
return -1;
79057900
}
79067901

7907-
self->ma_hash = (Py_hash_t)acc;
7908-
return (Py_hash_t)acc;
7902+
self->ma_hash = hash;
7903+
return hash;
79097904
}
79107905

79117906

TODO

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
TODO
22
====
33

4-
frozendict == frozendict
5-
frozendict(x=1, y=2) == frozendict(y=2, x=1)
6-
but hash() are not equal
4+
pickle
5+
https://github.com/Marco-Sulla/cpython/commit/fde4e6d236b19636063f8afedea8c50278205334

0 commit comments

Comments
 (0)