Si descarga el código fuente de Python, ¡lo encontrará con seguridad! Pero tenga en cuenta que la función hash se implementa para cada tipo de objeto de forma diferente.
Por ejemplo, encontrará la función hash Unicode en Objects/unicodeobject.c
en la función unicode_hash
. Es posible que tenga que buscar un poco más para encontrar la función hash de cadena. Encuentre la estructura que define el objeto que le interesa y, en el campo tp_hash
, encontrará la función que calcula el código hash de ese objeto.
Para el objeto de cadena: El código exacto se encuentra en Objects/stringobject.c
en la función 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;
}
obtener la fuente de Python c ¿oda? – ghostdog74
¿Cómo es interesante que (128000384 * 2! = 256000771)? ¿Te das cuenta de que (2 * "\ x01"! = "\ X02")? – tzot
Bueno, no me había dado cuenta antes de ver esos valores hash, pero 128000 ... y 256000 ... me hacen pensar que hay algunas relaciones. – YOU