mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-84783: Make the slice object hashable (GH-101264)
This commit is contained in:
parent
5170caf305
commit
61f1e67c6f
7 changed files with 53 additions and 12 deletions
|
@ -628,6 +628,42 @@ slice_traverse(PySliceObject *v, visitproc visit, void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* code based on tuplehash() of Objects/tupleobject.c */
|
||||
#if SIZEOF_PY_UHASH_T > 4
|
||||
#define _PyHASH_XXPRIME_1 ((Py_uhash_t)11400714785074694791ULL)
|
||||
#define _PyHASH_XXPRIME_2 ((Py_uhash_t)14029467366897019727ULL)
|
||||
#define _PyHASH_XXPRIME_5 ((Py_uhash_t)2870177450012600261ULL)
|
||||
#define _PyHASH_XXROTATE(x) ((x << 31) | (x >> 33)) /* Rotate left 31 bits */
|
||||
#else
|
||||
#define _PyHASH_XXPRIME_1 ((Py_uhash_t)2654435761UL)
|
||||
#define _PyHASH_XXPRIME_2 ((Py_uhash_t)2246822519UL)
|
||||
#define _PyHASH_XXPRIME_5 ((Py_uhash_t)374761393UL)
|
||||
#define _PyHASH_XXROTATE(x) ((x << 13) | (x >> 19)) /* Rotate left 13 bits */
|
||||
#endif
|
||||
|
||||
static Py_hash_t
|
||||
slicehash(PySliceObject *v)
|
||||
{
|
||||
Py_uhash_t acc = _PyHASH_XXPRIME_5;
|
||||
#define _PyHASH_SLICE_PART(com) { \
|
||||
Py_uhash_t lane = PyObject_Hash(v->com); \
|
||||
if(lane == (Py_uhash_t)-1) { \
|
||||
return -1; \
|
||||
} \
|
||||
acc += lane * _PyHASH_XXPRIME_2; \
|
||||
acc = _PyHASH_XXROTATE(acc); \
|
||||
acc *= _PyHASH_XXPRIME_1; \
|
||||
}
|
||||
_PyHASH_SLICE_PART(start);
|
||||
_PyHASH_SLICE_PART(stop);
|
||||
_PyHASH_SLICE_PART(step);
|
||||
#undef _PyHASH_SLICE_PART
|
||||
if(acc == (Py_uhash_t)-1) {
|
||||
return 1546275796;
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
|
||||
PyTypeObject PySlice_Type = {
|
||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||
"slice", /* Name of this type */
|
||||
|
@ -642,7 +678,7 @@ PyTypeObject PySlice_Type = {
|
|||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
0, /* tp_as_mapping */
|
||||
PyObject_HashNotImplemented, /* tp_hash */
|
||||
(hashfunc)slicehash, /* tp_hash */
|
||||
0, /* tp_call */
|
||||
0, /* tp_str */
|
||||
PyObject_GenericGetAttr, /* tp_getattro */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue