El hash que utiliza depende del objeto que se utiliza como clave: cada clase puede definir su propio método __hash __() y el valor que devuelve para una instancia particular es el que se utiliza para el diccionario.
Python proporciona la implementación de hash para los tipos str y tuple. Una rápida mirada a la fuente debería revelar el algoritmo exacto para esos.
El hash de una tupla se basa en los hashes de su contenido. El algoritmo es esencialmente esto (simplificado un poco):
def hash(tuple):
mult = 1000003
x = 0x345678
for index, item in enumerate(tuple):
x = ((x^hash(item)) * mult) & (1<<32)
mult += (82520 + (len(tuple)-index)*2)
return x + 97531
Para las cadenas, el intérprete también itera sobre cada personaje, combinándolos con esto (de nuevo, ligeramente simplificada) algoritmo:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x)^chr) & (1<<32)
return x
Un problema más grande preocuparse es evitar las colisiones hash. Las claves hash de colisión provocarán una búsqueda lineal a medida que el diccionario intente encontrar un lugar para almacenar el nuevo objeto (esto ahora se reconoce como un problema de seguridad, y el comportamiento puede estar cambiando en las próximas versiones de python)
Echa un vistazo a [Objects/dictnotes.txt] (http://hg.python.org/cpython/file/2.7/Objects/dictnotes.txt) – jfs
Eche un vistazo a [esta pregunta] (http://stackoverflow.com/questions/ 2070276/where-can-i-find-source-or-algorithm-of-pythons-hash-function). Tiene un enlace a [esta página] (http://effbot.org/zone/python-hash.htm) que describe cómo python hashes algunos tipos diferentes y podría ser útil para usted. – srgerg