Módulo 11 - Tabelas hash: o dicionário por dentro

A tabela hash: o dicionário por dentro

8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

Velocidade

O que você vai aprender

  • Entender a tabela hash como um vetor mais uma função que gera índices.
  • Ver a diferença entre procurar item por item e ir direto pela chave.
  • Ligar o dicionário que você já usou à estrutura que existe por dentro.
  • Reconhecer que a chave vira uma posição por meio de um cálculo.

Por que o dicionário parece mágica

No curso intermediário o dicionário entrou como uma ferramenta pronta: você criava um par chave-valor, tipo agenda["Ana"] guardando o telefone da Ana, e recuperava o telefone só citando o nome. Funcionava, e era rápido, mas ficou uma pergunta no ar: como o programa acha o valor da Ana tão depressa? Se fosse uma lista de mil contatos, procurar a Ana varrendo um por um levaria, no pior caso, mil comparações. O dicionário não faz isso. Ele acha a Ana quase no mesmo tempo, tenha ele dez ou dez milhões de contatos. Essa velocidade constante não é mágica nem sorte: é a tabela hash trabalhando por baixo.

A ideia central é trocar procura por cálculo. Imagine um armário de correspondência com cem escaninhos numerados. Se cada morador tivesse um número de escaninho fixo e você soubesse calcular esse número a partir do nome, não precisaria abrir escaninho por escaninho até achar a carta certa. Bastaria calcular o número e ir direto. A tabela hash faz exatamente isso: o vetor interno são os escaninhos, e a função de dispersão é a regra que transforma o nome (a chave) no número do escaninho (o índice). Guardar a carta da Ana é calcular o índice do nome Ana e depositar ali; buscar é calcular o mesmo índice e olhar naquele escaninho.

Diagrama de uma tabela hash. À esquerda, três chaves de texto: Ana, Bruno e Carla. No centro, uma caixa rotulada função hash com setas saindo de cada chave. À direita, um vetor vertical de escaninhos numerados de 0 a 6. Uma seta liga Ana ao escaninho 2, Bruno ao escaninho 5 e Carla ao escaninho 0, mostrando que a função transforma cada chave num índice do vetor.
A função hash transforma cada chave num índice do vetor. Guardar e buscar viram um cálculo, não uma procura.

Da chave ao índice: um cálculo, não uma busca

O coração da estrutura é a passagem da chave para o índice. A chave pode ser um texto, um número, uma data, qualquer coisa que identifique o dado. O índice, porém, precisa ser um número inteiro entre 0 e o tamanho do vetor menos um, porque é uma posição de vetor. A função hash é a ponte entre esses dois mundos: recebe uma chave qualquer e devolve um índice válido. Um jeito simples, só para enxergar a ideia, é somar os códigos das letras do nome e tirar o resto da divisão pelo tamanho do vetor. O resto sempre cai dentro da faixa de posições, e a mesma chave sempre gera o mesmo índice.

// vetor com 7 posições (escaninhos 0 a 6)
tabela <- [vazio, vazio, vazio, vazio, vazio, vazio, vazio]

FUNÇÃO indice_de(chave)
  soma <- 0
  PARA cada letra de chave faça
    soma <- soma + codigo(letra)   // codigo("A") = 65, etc.
  fim
  RETORNE soma mod 7               // resto da divisão: cai entre 0 e 6
fim

// guardar: calcula o índice e deposita ali
i <- indice_de("Ana")
tabela[i] <- ["Ana", "99999-1234"]

// buscar: calcula o MESMO índice e vai direto
j <- indice_de("Ana")
escreva(tabela[j])   // vai direto ao escaninho, sem varrer

A função soma os códigos das letras e tira o resto pelo tamanho do vetor. A mesma chave sempre cai no mesmo índice.

🎮 Jogo da aula

Verdadeiro ou falso: a tabela hash

Decida se cada afirmação sobre a tabela hash é verdadeira ou falsa. Pense no armário de escaninhos.

O que muda em relação à lista

Vale comparar com o que você já domina. Numa lista, achar um valor pelo conteúdo (não pela posição) obriga a percorrer, porque a lista não sabe onde cada coisa está, só a ordem em que foram colocadas. Numa lista ordenada dá para usar busca binária e cortar pela metade, mas ainda são vários passos, e manter a lista ordenada tem custo. A tabela hash muda o jogo ao pagar um preço diferente: ela gasta um pouco de memória extra (o vetor costuma ter mais posições do que itens guardados) e um cálculo rápido por acesso, e em troca vai direto ao dado sem depender do tamanho da coleção. É uma troca clássica em computação: usar mais espaço para ganhar tempo.

Teste rápido

Numa tabela hash, qual é o papel da função hash?

Perguntas frequentes

Tabela hash e dicionário são a mesma coisa?
São dois níveis da mesma ideia. Dicionário (ou mapa) é o conceito: uma coleção de pares chave-valor com busca pela chave. Tabela hash é a forma mais comum de implementar esse conceito, usando um vetor e uma função de dispersão. Quando você usa um dicionário na maioria das linguagens, é uma tabela hash trabalhando por baixo.
Por que usar o resto da divisão na função?
Porque o índice precisa caber dentro do vetor. Se o vetor tem 7 posições, o índice tem que ficar entre 0 e 6. O resto da divisão por 7 sempre devolve um número nessa faixa, não importa quão grande seja a soma das letras. É um jeito simples de encaixar qualquer número de chave numa posição válida.
A tabela hash mantém os itens em ordem?
Em geral, não. Como a posição vem de um cálculo sobre a chave, os itens ficam espalhados pelo vetor sem relação com ordem alfabética ou numérica. Se você precisa dos dados ordenados, a tabela hash sozinha não resolve; usa-se outra estrutura ou uma etapa de ordenação. A força dela é a busca pela chave, não a ordem.
Por que o vetor tem mais posições do que itens guardados?
Para dar espaço e espalhar melhor as chaves. Se o vetor fosse justo, muitas chaves cairiam na mesma posição e a estrutura perderia velocidade. Deixar folga (mais escaninhos do que cartas) reduz esses choques. É a troca de memória por tempo: gasta-se um pouco mais de espaço para manter as buscas rápidas.
Qualquer tipo de dado pode ser chave?
Em geral, chaves precisam ser estáveis, algo que não muda enquanto está guardado, para que a função sempre gere o mesmo índice. Textos, números e outros valores fixos servem bem. Estruturas que mudam por dentro costumam ser evitadas como chave, porque se a chave muda, o índice calculado deixa de bater com onde o dado foi guardado.
Como isso aparece nas linguagens reais?
Em Python é o dict; em JavaScript há objetos e a estrutura Map; outras linguagens têm HashMap, dicionário ou tabela de associação. Os nomes mudam, mas por baixo é quase sempre uma tabela hash. Entender a estrutura ajuda a saber por que essas coleções são rápidas para buscar pela chave e por que não guardam ordem por padrão.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.