Charla Objetos hashables

Objetos hashables

Por Víctor Terrón

Las tablas hash son la estructura de datos más importante conocida por la humanidad y lo que Python usa internamente para implementar dicts y sets. A fin de poder usar nuestras propias clases como claves de un diccionario o miembros de un conjunto, éstas han de ser hashables. La documentación de Python nos explica cómo hacerlo: tan sólo necesitamos implementar en nuestra clase los métodos hash() y eq() — o, si lo preferimos, cmp(). Hacer eso basta para que, por ejemplo, podamos definir un set de objetos de nuestra recién definida clase Perro.

La misma documentación, sin embargo, también nos ofrece algunos consejos cuya motivación no es inmediatamente obvia. Por ejemplo: si nuestra clase no define eq() o cmp() para la comparación entre elementos, no debería definir hash(). ¿Por qué? Otro ejemplo: si nuestra clase define objetos mutables e implementa eq() o cmp(), tampoco debe implementar hash(). De nuevo, ¿por qué? Ésta charla es una incursión en el modelo de datos de Python en la que exploraremos la motivación detrás de tales advertencias.

Resumen esquemático de la charla:

Dicts y sets. Tablas hash. Introducción. Inserción: O(1) Consulta: O(1) Borrado: O(1) Resolución de colisiones. Objetos hashables: hash() eq() cmp() Relación entre hash() y eq() Qué ocurriría si definimos... hash() pero no eq() eq() pero no hash() hash() con una clase mutable. Ni eq() ni hash()