Hash Python ()

O método hash () retorna o valor hash de um objeto, se houver.

Os valores hash são apenas números inteiros usados ​​para comparar as chaves do dicionário durante uma pesquisa rápida no dicionário.

Internamente, o hash()método chama o __hash__()método de um objeto que é definido por padrão para qualquer objeto. Veremos isso mais tarde.

A sintaxe do hash()método é:

 hash (objeto)

Parâmetros hash ()

hash() método leva um único parâmetro:

  • objeto - o objeto cujo valor hash deve ser retornado (inteiro, string, float)

Valor de retorno de hash ()

hash() método retorna o valor hash de um objeto, se houver.

Se um objeto tiver um __hash__()método personalizado , ele trunca o valor de retorno para o tamanho de Py_ssize_t.

Exemplo 1: Como funciona o hash () em 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'))

Resultado

 Hash para 181 é: 181 Hash para 181,23 é: 530343892119126197 Hash para Python é: 2230730083538390373 

Exemplo 2: hash () para objeto de tupla imutável?

hash() método só funciona para objetos imutáveis ​​como tupla.

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

Resultado

 O hash é: -695778075465126279

Como hash () funciona para objetos personalizados?

Conforme declarado acima, o hash()método chama internamente o __hash__()método. Portanto, qualquer objeto pode substituir os __hash__()valores de hash personalizados.

Mas para uma implementação de hash correta, __hash__()deve sempre retornar um número inteiro. E, ambos os métodos __eq__()e __hash__()devem ser implementados.

Abaixo estão os casos para __hash__()substituição correta .

Casos para implementação de hash customizado para objetos
__eq __ () __cerquilha__() Descrição
Definido (por padrão) Definido (por padrão) Se deixado como está, todos os objetos são comparados de forma desigual (exceto eles mesmos)
(Se mutável) Definido Não deve ser definido A implementação da coleção hashable exige que o valor hash da chave seja imutável
Não definido Não deve ser definido Se __eq__()não estiver definido, __hash__()não deve ser definido.
Definiram Não definido As instâncias de classe não serão utilizáveis ​​como coleção hashable. __hash __ () implicidade definida como None. Gera TypeErrorexceção se tentar recuperar o hash.
Definiram Retenha dos pais __hash__ = .__hash__
Definiram Não quer hash __hash__ = None. Gera a exceção TypeError se tentar recuperar o hash.

Exemplo 3: hash () para objetos personalizados substituindo __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))

Resultado

 O hash é: 3785419240612877014

Nota: Você não precisa implementar o __eq__()método para o hash, pois ele é criado por padrão para todos os objetos.

Artigos interessantes...