Hash de Python ()

El método hash () devuelve el valor hash de un objeto si tiene uno.

Los valores hash son solo números enteros que se utilizan para comparar rápidamente las claves del diccionario durante una búsqueda de diccionario.

Internamente, el hash()método llama al __hash__()método de un objeto que se establece de forma predeterminada para cualquier objeto. Veremos esto más tarde.

La sintaxis del hash()método es:

 hash (objeto)

Parámetros hash ()

hash() El método toma un solo parámetro:

  • objeto : el objeto cuyo valor hash se devolverá (entero, cadena, flotante)

Valor de retorno de hash ()

hash() El método devuelve el valor hash de un objeto si tiene uno.

Si un objeto tiene un __hash__()método personalizado , trunca el valor de retorno al tamaño de Py_ssize_t.

Ejemplo 1: ¿Cómo funciona hash () en Python?

 # hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))

Salida

 Hash para 181 es: 181 Hash para 181.23 es: 530343892119126197 Hash para Python es: 2230730083538390373 

Ejemplo 2: hash () para un objeto tupla inmutable?

hash() El método solo funciona para objetos inmutables como tupla.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Salida

 El hash es: -695778075465126279

¿Cómo funciona hash () para objetos personalizados?

Como se indicó anteriormente, el hash()método llama internamente al __hash__()método. Por lo tanto, cualquier objeto puede anular __hash__()los valores hash personalizados.

Pero para una correcta implementación del hash, __hash__()siempre debe devolver un número entero. Y, a la vez __eq__(), y __hash__()los métodos tienen que ser aplicadas.

A continuación se muestran los casos para una __hash__()anulación correcta .

Casos de implementación de hash personalizados para objetos
__eq __ () __picadillo__() Descripción
Definido (por defecto) Definido (por defecto) Si se deja como está, todos los objetos se comparan de manera desigual (excepto ellos mismos)
(Si es mutable) Definido No debe definirse La implementación de la colección hash requiere que el valor hash de la clave sea inmutable
No definida No debe definirse Si __eq__()no está definido, __hash__()no debería definirse.
Definido No definida Las instancias de clase no se podrán utilizar como colección hash. __hash __ () implícitamente establecido en None. Genera una TypeErrorexcepción si se intenta recuperar el hash.
Definido Retener de los padres __hash__ = .__hash__
Definido No quiere hash __hash__ = None. Genera la excepción TypeError si se intenta recuperar el hash.

Ejemplo 3: hash () para objetos personalizados anulando __hash __ ()

 class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))

Salida

 El hash es: 3785419240612877014

Nota: No es necesario implementar el __eq__()método para el hash, ya que se crea de forma predeterminada para todos los objetos.

Articulos interesantes...