mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #1621: Fix undefined behaviour in bytes.__hash__, str.__hash__, tuple.__hash__, frozenset.__hash__ and set indexing operations.
This commit is contained in:
parent
0390151100
commit
57e683e53e
5 changed files with 26 additions and 25 deletions
|
@ -7721,22 +7721,22 @@ unicode_getitem(PyUnicodeObject *self, Py_ssize_t index)
|
|||
}
|
||||
|
||||
/* Believe it or not, this produces the same value for ASCII strings
|
||||
as string_hash(). */
|
||||
as bytes_hash(). */
|
||||
static Py_hash_t
|
||||
unicode_hash(PyUnicodeObject *self)
|
||||
{
|
||||
Py_ssize_t len;
|
||||
Py_UNICODE *p;
|
||||
Py_hash_t x;
|
||||
Py_uhash_t x;
|
||||
|
||||
if (self->hash != -1)
|
||||
return self->hash;
|
||||
len = Py_SIZE(self);
|
||||
p = self->str;
|
||||
x = *p << 7;
|
||||
x = (Py_uhash_t)*p << 7;
|
||||
while (--len >= 0)
|
||||
x = (1000003*x) ^ *p++;
|
||||
x ^= Py_SIZE(self);
|
||||
x = (1000003U*x) ^ (Py_uhash_t)*p++;
|
||||
x ^= (Py_uhash_t)Py_SIZE(self);
|
||||
if (x == -1)
|
||||
x = -2;
|
||||
self->hash = x;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue