English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico do Python

Controle de fluxo do Python

Funções do Python

Tipos de Dados do Python

Operação de arquivo do Python

Objetos e classes do Python

Data e hora do Python

Conhecimento avançado do Python

Manual de referência do Python

Uso e exemplo do hash() no Python

Funções internas do Python

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)

Parâmetro do hash()

O método hash() aceita um parâmetro:

  • objeto -O objeto a retornar seu valor de hash (inteiro, string, número flutuante)

O valor retornado pelo hash()

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.

Exemplo1Como o método hash() funciona no Python?

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

Exemplo2Pergunta sobre o hash() de objetos tuplas imutáveis?

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 o método hash() é usado para objetos personalizados?

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.

A seguir está a rewrite correta de __hash__().
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 definidoNão deve ser definidoSe não for definido __eq__(), não deve ser definido __hash__().
DefinidoNã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.

DefinidoManter do pai da classe__hash__ = <ParentClass>.__hash__
DefinidoNão hacher

__hash__ = None

Se tentar recuperar hash, será lançada uma exceção TypeError.

Exemplo3:AO TRAVÉS DA REESCRITA DE __hash__() DE OBJETOS PERSONALIZADOS

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.

Funções internas do Python