Si vous téléchargez le code source de Python, vous le trouverez à coup sûr! Mais gardez à l'esprit que la fonction de hachage est implémentée différemment pour chaque type d'objet. Par exemple, vous trouverez la fonction de hachage unicode dans Objects/unicodeobject.c
dans la fonction unicode_hash
. Vous devrez peut-être regarder un peu plus pour trouver la fonction de hachage de chaîne. Trouvez la structure définissant l'objet qui vous intéresse, et dans le champ tp_hash
, vous trouverez la fonction qui calcule le code de hachage de cet objet.
Pour l'objet chaîne: Le code exact se trouve dans Objects/stringobject.c
dans la fonction 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;
}
obtenir la source Python c ode? – ghostdog74
Comment est-ce intéressant (128000384 * 2! = 256000771)? Est-ce que vous réalisez que (2 * "\ x01"! = "\ X02")? – tzot
Eh bien, je ne me suis pas rendu compte avant de voir ces valeurs de hachage, mais 128000 .. et 256000 ... me font penser qu'il y a quelques relations dedans. – YOU