Objetos hashable podem existir em conjuntos e como chaves de dicionário. A imutabilidade é a maneira usual de garantir estabilidade de hash - se o valor de um objeto mudar após a inserção, as buscas falharão silenciosamente.
key = (42, "ada") # tupla de hashables - OKtags = frozenset(["a", "b"]) # conjunto hashable# NÃO é hashable:# bad = ([1, 2],) # lista dentro de tupla# { [1, 2]: "x" } # lista como chave
Quando usar isso:
Usando objetos como chaves de dicionário ou membros de conjunto
Construindo caches com chaves baseadas em argumentos
# dataclasses com unsafe_hash gera __hash__ a partir dos campos@dataclass(frozen=True)class Coord: x: int y: int# desabilita hash quando semânticas mutáveis são necessárias@dataclass(eq=True, frozen=False)class Buffer: data: bytearray
Dataclass mutável em conjunto - Dataclass mutável → não hashable por padrão. Correção:frozen=True ou excluir de conjuntos.
__eq__ personalizado sem __hash__ - Python define __hash__ = None. Correção: Implemente __hash__ consistente ou use padrões functools.cached_property com cuidado.
Hash muda quando os campos mudam - Viola o contrato de dicionário/conjunto. Correção: Use apenas objetos imutáveis como chaves.
Floats NaN - float('nan') é hashable, mas nan != nan. Correção: Evite chaves NaN.
Tuplas com listas mutáveis dentro - Tupla é hashable, mas o conteúdo da lista pode mutar, quebrando invariantes se exposto. Correção: Não modifique mutáveis aninhados usados em chaves.