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 .
__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 TypeError exceçã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.