Se si scarica il codice sorgente di Python, lo troverete di sicuro! Ma tenete a mente che la funzione di hash è implementata in modo diverso per ogni tipo di oggetto.
Ad esempio, nella funzione unicode_hash
si trova la funzione di hash unicode in Objects/unicodeobject.c
. Potrebbe essere necessario cercare un po 'di più per trovare la funzione hash della stringa. Trova la struttura che definisce l'oggetto a cui sei interessato e nel campo tp_hash
troverai la funzione che calcola il codice hash di quell'oggetto.
Per l'oggetto stringa di: il codice esatto si trova nella Objects/stringobject.c
nella funzione 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;
}
ottenere l'origine Python c ode? – ghostdog74
Com'è interessante (128000384 * 2! = 256000771)? Ti rendi conto che (2 * "\ x01"! = "\ X02")? – tzot
Beh, non mi sono reso conto prima di vedere quei valori hash, ma 128000 .. e 256000 ... mi fanno pensare che ci siano delle relazioni in esso. – YOU