Perl usa una matriz con listas vinculadas para contener colisiones. Tiene una heurística simple para duplicar automáticamente el tamaño de la matriz según sea necesario. También hay código para compartir claves entre hashes para guardar un poco de memoria. Puede leer sobre esto en el Perl Illustrated Guts fechado pero aún relevante bajo "HV". Si eres realmente aventurero, puedes profundizar en hv.c.
El algoritmo de hash solía ser bastante simple, pero es probablemente mucho más complicado ahora con Unicode. Debido a que el algoritmo era predecible hubo un ataque DoS por el cual el atacante generó datos que causarían colisiones hash. Por ejemplo, una gran lista de claves enviadas a un sitio web como datos POST. El programa Perl probablemente lo dividiría y lo convertiría en un hash que luego lo metería todo en un solo cubo. El hash resultante fue O (n) en lugar de O (1). Lanza una gran cantidad de solicitudes POST en un servidor y podrías obstruir la CPU. Como resultado, Perl ahora perturba la función hash con un poco de datos aleatorios.
También es posible que desee mirar how Parrot implements basic hashes que es significativamente menos aterrador que la implementación de Perl 5.
En cuanto a "más eficiente y práctico", utilice la biblioteca hash de otra persona. Por el amor de Dios, no escribas uno para usar en producción. Hay un montón de ellos robustos y eficientes por ahí ya.
Tal vez usted desea preguntar "¿Cómo se implementan los mapas ..." como una tabla hash no es la única manera de implementar un mapa! – Artelius
Buen comentario. Pero el problema es que ya he construido el trabajo en tierra en base a los hashes calculados de los símbolos. Por cierto, ¿qué otras formas se implementan los mapas junto a los hashes, que pensé que todos usaban? – CDR
Los mapas a veces también se construyen a partir de árboles binarios. Generalmente se usa cuando el tipo de clave es inmanejable, o si desea conservar un cierto orden de los datos en el mapa (para que pueda iterar de la A a la Z). – Crashworks