English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O método hash() retorna o valor de hash de um objeto (se houver).
O valor de hash é apenas alguns inteiros, usados para comparação de chaves no processo de busca no dicionário.
Internamente, o método hash() chama o método da classe __hash__(), que, por padrão, é configurado para qualquer objeto. Vamos ver isso mais tarde.
A sintaxe do método hash() é:
hash(object)
O método hash() aceita um parâmetro:
objeto -O objeto a retornar seu valor de hash (inteiro, string, número flutuante)
O método hash() retorna o valor de hash de um objeto (se houver).
Se o objeto tiver um método __hash__() personalizado, ele retornará um valor truncado paraPy_ssize_ttamanho.
181o hash é:181)) # hash decimal 181.23o hash é:181.23)) # hash de string print('O hash de Python é:', hash('Python'))
Quando você executar o programa, a saída será:
181o hash é: 181 181.23o hash de: 579773580 O hash de Python é: 2101984854
O método hash() é aplicável apenas a objetos imutáveis, comotuple.
# tupla de vogais vowels = ('a', 'e', 'i', 'o', 'u') print('hash é:', hash(vowels))
Quando você executar o programa, a saída será:
hash é: -695778075465126279
Como mencionado anteriormente, o método hash() chama o método __hash__() internamente. Portanto, qualquer objeto pode sobrescrever __hash__() para obter um valor de hash personalizado.
Mas para uma implementação correta de hash, __hash__() deve sempre retornar um inteiro. E, é necessário implementar tanto __eq__ quanto __hash__ métodos.
Mas para uma implementação correta de hash, __hash__() deve sempre retornar um inteiro. E, é necessário implementar tanto __eq__ quanto __hash__ métodos.
Exemplos de implementação personalizada de hash de objetos | __eq__ | __hash__ |
---|---|---|
Descrição | Descrição | Definido (padrão) |
Se mantido em branco, todas as comparações de objetos serão iguais (exceto entre eles mesmos) | Não deve ser definido | Para implementar conjuntos hasháveis, os valores de hash das chaves devem ser imutáveis (se mutável, definido) |
Não definido | Não deve ser definido | Se não for definido __eq__(), não deve ser definido __hash__(). |
Definido | Não definido | Exemplos de classes não poderão ser usados como conjuntos hasháveis. __hash__ é configurado implicitamente comoNone Se tentar recuperar hash, será lançada uma exceção TypeError. |
Definido | Manter do pai da classe | __hash__ = <ParentClass>.__hash__ |
Definido | Não hacher | __hash__ = None Se tentar recuperar hash, será lançada uma exceção TypeError. |
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('hash é:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
Quando você executar o programa, a saída será:
hash é: 3785419240612877014
Atenção:Você não precisa implementar o método __eq__ para hash, pois, por padrão, todos os objetos terão hash criado.