Aquí hay un pseudocódigo más cercano a lo que realmente sucede. Imagine que el diccionario tiene un atributo data
que contiene la clave, pares de valores y un size
que es el número de celdas asignadas.
def lookup(d, key):
perturb = j = hash(key)
while True:
cell = d.data[j % d.size]
if cell.key is EMPTY:
raise IndexError
if cell.key is not DELETED and (cell.key is key or cell.key == key):
return cell.value
j = (5 * j) + 1 + perturb
perturb >>= PERTURB
El valor perturb
se asegura de que todos los bits del código hash se utilizan finalmente en la resolución de conflictos de hash pero una vez que se ha degradado a 0 el (5*j)+1
será finalmente tocar todas las celdas de la tabla.
size
es siempre mucho más grande que el número de celdas realmente utilizadas, por lo que se garantiza que el hash eventualmente golpeará una celda vacía cuando la clave no exista (y normalmente debería golpear una bastante rápidamente). También hay un valor eliminado para que una tecla indique una celda que no debe terminar la búsqueda pero que no está actualmente en uso.
En cuanto a su pregunta sobre la longitud de la cadena de clave, hashing una cadena verá todos los caracteres de la cadena, pero una cadena también tiene un campo utilizado para almacenar el hash calculado. Por lo tanto, si utiliza cadenas diferentes cada vez para realizar la búsqueda, la longitud de la cadena puede tener un rumbo, pero si tiene un conjunto fijo de claves y vuelve a utilizar las mismas cadenas, el hash no se volverá a calcular después de la primera vez que se usa . Python obtiene un beneficio de esto ya que la mayoría de las búsquedas de nombres involucran diccionarios y una sola copia de cada variable o nombre de atributo se almacena internamente, por lo que cada vez que accede a un atributo x.y
hay una búsqueda en el diccionario pero no una llamada a una función hash.
Mientras puedo ver cómo funcionan los diccionarios python como se describe a continuación, los hashes en general son más ricos que esto. Uno puede imaginar que esta búsqueda simple llevará mucho tiempo con un diccionario grande. Los hash de Perl emplean un sistema que es básicamente un índice agrupando los elementos hash por cada carácter de la clave. – shigeta
ver http://www.perl.com/pub/2002/10/01/hashes.html – shigeta