>>> hash("\x01")
128000384
>>> hash("\x02")
256000771
>>> hash("\x03")
384001154
>>> hash("\x04")
512001541
Интересная часть 128000384 x 2
не 256000771
, и также другие
Я просто задаюсь вопросом, как тот алгоритм работает, и хотят изучить что-то на нем.
Если вы загрузите исходный код Python, вы найдете это точно! Но имейте в виду использование хеш-функции реализуется для каждого вида объектов по-разному.
Например, вы найдете функцию HASH Unicode в объектах / UnicodeObject.c
в функции Unicode_Hash
. Возможно, вам придется выглядеть немного больше, чтобы найти функцию хеш-строки. Найдите структуру, определяющую заинтересованность объекта, и в поле TP_HASH
, вы найдете функцию, которая вычисляет хеш-код этого объекта.
Для String Object : точный код найден в объектов / stringobject.c
в функции String_hash
:
static long string_hash(PyStringObject *a)
{
register Py_ssize_t len;
register unsigned char *p;
register long x;
if (a->ob_shash != -1)
return a->ob_shash;
len = Py_SIZE(a);
p = (unsigned char *) a->ob_sval;
x = *p << 7;
while (--len >= 0)
x = (1000003*x) ^ *p++;
x ^= Py_SIZE(a);
if (x == -1)
x = -2;
a->ob_shash = x;
return x;
}