Solución:
Del glosario de Python:
Un objeto es hash si tiene un valor hash que nunca cambia durante su vida (necesita un
__hash__()
método), y se puede comparar con otros objetos (necesita un__eq__()
o__cmp__()
método). Los objetos hash que se comparan iguales deben tener el mismo valor hash.Hashability hace que un objeto se pueda utilizar como clave de diccionario y miembro de un conjunto, porque estas estructuras de datos utilizan el valor hash internamente.
Todos los objetos incorporados inmutables de Python son hash, mientras que ningún contenedor mutable (como listas o diccionarios) lo es. Los objetos que son instancias de clases definidas por el usuario son hash de forma predeterminada; todos comparan desiguales, y su valor hash es su
id()
.
Todas las respuestas aquí tienen una buena explicación funcional de los objetos hash en Python, pero creo que primero se debe entender el término Hashing.
Hashing es un concepto en ciencias de la computación que se utiliza para crear estructuras de datos de acceso pseudoaleatorio de alto rendimiento en las que se almacenan grandes cantidades de datos y se accede a ellos rápidamente.
Por ejemplo, si tiene 10,000 números de teléfono y desea almacenarlos en una matriz (que es una estructura de datos secuenciales que almacena datos en ubicaciones de memoria contiguas y proporciona acceso aleatorio), pero es posible que no tenga la cantidad requerida de números contiguos ubicaciones de memoria.
Por lo tanto, puede usar una matriz de tamaño 100 y usar una función hash para asignar un conjunto de valores a los mismos índices, y estos valores se pueden almacenar en una lista vinculada. Esto proporciona un rendimiento similar al de una matriz.
Ahora, una función hash puede ser tan simple como dividir el número con el tamaño de la matriz y tomar el resto como índice.
Para obtener más detalles, consulte https://en.wikipedia.org/wiki/Hash_function
Aquí hay otra buena referencia: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
Todo lo que no sea mutable (significa mutable, probablemente cambie) se puede aplicar hash. Además de la función hash a buscar, si una clase la tiene, por ejemplo. dir(tuple)
y buscando el __hash__
método, aquí hay algunos ejemplos
#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable
Lista de tipos inmutables:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
Lista de tipos mutables:
list, dict, set, bytearray, user-defined classes