@@ -115,6 +115,48 @@ record_length(ApgRecordObject *o)
115115}
116116
117117
118+ #if  PY_VERSION_HEX  >= 0x03080000 
119+ 
120+ #if  SIZEOF_PY_UHASH_T  >  4 
121+ #define  _PyHASH_XXPRIME_1  ((Py_uhash_t)11400714785074694791ULL)
122+ #define  _PyHASH_XXPRIME_2  ((Py_uhash_t)14029467366897019727ULL)
123+ #define  _PyHASH_XXPRIME_5  ((Py_uhash_t)2870177450012600261ULL)
124+ #define  _PyHASH_XXROTATE (x ) ((x << 31) | (x >> 33)) /* Rotate left 31 bits */ 
125+ #else 
126+ #define  _PyHASH_XXPRIME_1  ((Py_uhash_t)2654435761UL)
127+ #define  _PyHASH_XXPRIME_2  ((Py_uhash_t)2246822519UL)
128+ #define  _PyHASH_XXPRIME_5  ((Py_uhash_t)374761393UL)
129+ #define  _PyHASH_XXROTATE (x ) ((x << 13) | (x >> 19)) /* Rotate left 13 bits */ 
130+ #endif 
131+ 
132+ static  Py_hash_t 
133+ record_hash (ApgRecordObject  * v )
134+ {
135+  Py_ssize_t  i ;
136+  Py_uhash_t  acc  =  _PyHASH_XXPRIME_5 ;
137+  Py_ssize_t  len  =  Py_SIZE (v );
138+  PyObject  * * els  =  v -> ob_item ;
139+  for  (i  =  0 ; i  <  len ; i ++ ) {
140+  Py_uhash_t  lane  =  PyObject_Hash (els [i ]);
141+  if  (lane  ==  (Py_uhash_t )- 1 ) {
142+  return  -1 ;
143+  }
144+  acc  +=  lane  *  _PyHASH_XXPRIME_2 ;
145+  acc  =  _PyHASH_XXROTATE (acc );
146+  acc  *= _PyHASH_XXPRIME_1 ;
147+  }
148+ 
149+  /* Add input length, mangled to keep the historical value of hash(()). */ 
150+  acc  +=  len  ^ (_PyHASH_XXPRIME_5  ^ 3527539UL );
151+ 
152+  if  (acc  ==  (Py_uhash_t )- 1 ) {
153+  return  1546275796 ;
154+  }
155+  return  (Py_hash_t )acc ;
156+ }
157+ 
158+ #else 
159+ 
118160static  Py_hash_t 
119161record_hash (ApgRecordObject  * v )
120162{
@@ -150,6 +192,8 @@ record_hash(ApgRecordObject *v)
150192 return  (Py_hash_t )x ;
151193}
152194
195+ #endif 
196+ 
153197
154198static  PyObject  * 
155199record_richcompare (PyObject  * v , PyObject  * w , int  op )
0 commit comments