Las tablas hash se apoyan en funciones que comprimen un dominio de claves potencialmente infinito en un conjunto finito de buckets. Cuando dos claves distintas producen el mismo indice, ocurre una colision. Saber prevenirlas y resolverlas es esencial para mantener el tiempo promedio O(1).
Ocurre cuando dos claves distintas producen el mismo valor hash y, al aplicar el modulo del tamano de la tabla, terminan en el mismo bucket. Ninguna funcion hash general puede garantizar ausencia de colisiones porque el espacio de claves suele ser mucho mas grande que la cantidad de buckets.
Ejemplo rapido: con una tabla de 8 buckets y la funcion hash(x) = x % 8, las claves 10 y 18 devuelven 2, por lo que intentan ocupar el mismo bucket 2.
Aun con una funcion de calidad, la cantidad de inserciones puede crecer hasta saturar la tabla y forzar colisiones; de ahi la importancia de monitorear el factor de carga y planificar rehashing.
Existen dos familias principales de resolucion de colisiones:
Reglas practicas:
En ambos casos es clave mantener la funcion hash estable mientras la tabla este en uso; cambiarla sin reinsertar puede volver inaccesibles los elementos guardados.
| Criterio | Encadenamiento | Open addressing |
|---|---|---|
| Memoria | Usa nodos extra por colision | Todo vive en el array |
| Rehashing | Reinsertar nodos; costo O(n) | Reinsertar entradas; costo O(n) |
| Cache locality | Peor (punteros dispersos) | Mejor (array contiguo) |
| Borrado | Eliminar nodo en la lista del bucket | Marcar celda como borrada; afecta el probing |
| Complejidad promedio | O(1) con listas cortas (alpha bajo) | O(1) con probing corto (alpha bajo) |
| Escenarios tipicos | Tablas con muchas eliminaciones o claves de tamano variable | Tablas compactas y de lectura intensiva |
Ambas estrategias funcionan bien con factores de carga moderados. Chaining se vuelve costoso si las listas crecen; open addressing sufre clustering si el probing recorre secuencias largas. Elegir una u otra depende del perfil de insercion/borrado, memoria disponible y patrones de acceso.