← Todos os Posts

Códigos de Hamming: como os computadores corrigem seus próprios erros

Dados são frágeis. Um raio cósmico inverte um bit na sua RAM. Ruído elétrico corrompe um sinal. Um arranhão danifica um disco. Em um mundo onde um único bit invertido pode travar um sistema ou corromper um arquivo, como os computadores continuam funcionando?

A resposta é uma das ideias mais elegantes da ciência da computação: códigos de correção de erros.

Principais conclusões

  • Os códigos de Hamming adicionam redundância estratégica — Ao posicionar bits de paridade em posições que são potências de 2, o código consegue detectar E corrigir erros de bit único automaticamente.
  • A síndrome aponta diretamente para o erro — Aplicar XOR nas posições de todos os bits “1” revela a localização exata de qualquer erro de bit único, permitindo correção sem retransmissão.
  • 7 bits transportam 4 bits de dados — O Hamming(7,4) usa apenas 3 bits extras para proteger 4 bits de dados, alcançando 57% de eficiência com correção completa de erro único.
  • Essa matemática está em toda parte — RAM ECC, QR codes, comunicação com o espaço profundo, armazenamento RAID e Bluetooth usam variações da descoberta de Hamming.
  • A informação tem limites fundamentais — Claude Shannon provou que existe um máximo teórico para quanta correção de erros é possível. Os códigos de Hamming se aproximam desse limite de forma elegante.

Por que não podemos simplesmente enviar os dados duas vezes?

A abordagem ingênua para correção de erros é a repetição. Envie cada bit três vezes: 0 se torna 000, 1 se torna 111. Se você receber 010, a votação por maioria indica que provavelmente é 0.

Isso funciona, mas é desperdiçador. Para enviar 4 bits de informação, você transmitiria 12 bits. Isso é 33% de eficiência.

Richard Hamming, trabalhando nos Bell Labs em 1950, fez uma pergunta melhor: Qual é a redundância mínima necessária para não apenas detectar, mas corrigir erros?

A resposta dele mudou a computação para sempre.


Como funciona o código Hamming(7,4)?

A sacada de Hamming foi geométrica. Em vez de repetição por força bruta, posicione os bits de paridade em posições estratégicas onde eles cumprem dupla função: cada bit de paridade verifica simultaneamente múltiplas posições de dados.

Position:   1   2   3   4   5   6   7
Binary:    001 010 011 100 101 110 111
Type:       P1  P2  D1  P4  D2  D3  D4
            ↑   ↑       ↑
         Parity bits at powers of 2

A mágica: as posições 1, 2 e 4 são bits de paridade. Cada um verifica todas as posições que possuem o bit correspondente ativo em sua representação binária:

  • P1 (posição 1 = 001) verifica as posições 1, 3, 5, 7 (todas as posições ímpares)
  • P2 (posição 2 = 010) verifica as posições 2, 3, 6, 7
  • P4 (posição 4 = 100) verifica as posições 4, 5, 6, 7

Quando ocorre um erro, cada verificação de paridade passa (0) ou falha (1). Os três resultados formam um número binário que aponta diretamente para a posição do erro.


Experimente: simulador interativo de Hamming

Insira 4 bits de dados, codifique-os e depois clique em qualquer bit para simular um erro. Observe a detecção por síndrome identificar a localização exata do erro.


Por que a síndrome aponta para o erro?

Esta é a parte bonita. Quando você aplica XOR em todas as posições que contêm um 1, obtém diretamente a posição do erro.

Digamos que a posição 5 foi invertida. A posição 5 em binário é 101: - O bit 0 está ativo → a verificação P1 falha - O bit 1 não está ativo → a verificação P2 passa - O bit 2 está ativo → a verificação P4 falha

Síndrome = 101 = 5. O erro está na posição 5.

Não é coincidência — Hamming projetou as posições para que suas representações binárias codifiquem essa informação. Cada posição tem uma assinatura binária única, e as verificações de paridade leem essa assinatura.


O que acontece com dois erros?

O Hamming(7,4) pode: - ✓ Detectar e corrigir qualquer erro de bit único - ✓ Detectar (mas não corrigir) erros de dois bits - ✗ Três ou mais erros podem ser corrigidos incorretamente

Para maior confiabilidade, uma versão estendida chamada SECDED (Single Error Correction, Double Error Detection) adiciona mais um bit de paridade cobrindo todas as posições. A RAM ECC do seu computador usa isso.


Onde os códigos de Hamming são usados hoje?

Aplicação Por que é importante
RAM ECC Raios cósmicos invertem ~1 bit por GB por mês. O ECC os corrige silenciosamente.
QR Codes Até 30% de um QR code pode estar danificado e ainda assim ser lido corretamente.
Espaço profundo Os dados da Voyager percorrem bilhões de quilômetros com códigos Reed-Solomon (descendentes de Hamming).
RAID 2 Os primeiros sistemas RAID usavam códigos de Hamming em conjuntos de discos.
Bluetooth A correção antecipada de erros lida com interferência sem fio.

A conexão com a teoria da informação

O trabalho de Hamming aconteceu paralelamente ao artigo fundacional de Claude Shannon sobre teoria da informação (1948). Shannon provou que, para qualquer canal ruidoso, existe um código de correção de erros que pode transmitir dados com probabilidade de erro arbitrariamente baixa — se você aceitar alguma perda de eficiência.

O limite de Shannon define o máximo teórico. Os códigos de Hamming não o alcançam, mas são práticos, rápidos e elegantes. Códigos modernos como Turbo codes e LDPC codes se aproximam mais do limite de Shannon e alimentam tudo, de redes celulares 4G/5G a TV por satélite.


A sacada por trás da sacada

O que torna a solução de Hamming brilhante não é apenas que ela funciona — é que a posição do erro emerge da estrutura. Os bits de paridade não “sabem” onde está o erro; suas relações o codificam implicitamente.

Esse é um padrão recorrente na grande engenharia: não construa lógica de detecção complexa. Projete o sistema de modo que a resposta surja naturalmente da matemática.


Perguntas frequentes

O que é um código de Hamming?

Um código de Hamming é um código de correção de erros que adiciona bits de paridade em posições específicas (potências de 2) para detectar e corrigir erros de bit único. A versão mais comum, Hamming(7,4), codifica 4 bits de dados em 7 bits no total, permitindo a correção automática de qualquer erro de bit único sem retransmissão.

Como a síndrome identifica a posição do erro?

Cada bit de paridade verifica posições cuja representação binária tem um 1 na posição correspondente àquele bit de paridade. Quando um bit é invertido, as verificações de paridade que cobrem aquela posição falham. A combinação das verificações que falharam forma um número binário igual à posição do erro. Isso funciona porque cada posição tem uma "assinatura" binária única.

Os códigos de Hamming conseguem corrigir múltiplos erros?

O Hamming(7,4) padrão só consegue corrigir erros de bit único. Ele pode detectar (mas não corrigir) erros de dois bits. Para maior confiabilidade, o SECDED (Single Error Correction, Double Error Detection) adiciona um bit de paridade extra, e códigos mais sofisticados como Reed-Solomon conseguem corrigir múltiplos erros.

Por que os bits de paridade são colocados em potências de 2?

As posições 1, 2, 4, 8, etc. correspondem a bits individuais em binário (001, 010, 100, 1000). Isso garante que cada bit de paridade verifique uma "fatia" não sobreposta da palavra de código. As posições de dados (3, 5, 6, 7...) têm múltiplos bits ativos em binário, então são verificadas por múltiplos bits de paridade, criando a redundância necessária para a correção de erros.

Onde a RAM ECC é usada e por que ela é importante?

A RAM ECC (Error-Correcting Code) é usada em servidores, estações de trabalho e sistemas de missão crítica. Raios cósmicos e ruído elétrico causam aproximadamente uma inversão de bit por gigabyte por mês. Para sistemas que rodam 24 horas por dia com grandes quantidades de RAM, erros não corrigidos causariam travamentos e corrupção de dados. A RAM ECC usa códigos SECDED para corrigir esses erros silenciosamente.


Resumo rápido

Os códigos de Hamming resolvem a correção de erros com redundância mínima, posicionando bits de paridade em potências de 2, onde cada bit verifica um subconjunto específico de posições. Quando ocorre um erro, as verificações de paridade que falham formam um número binário apontando diretamente para o erro — sem lógica complexa, apenas operações XOR. Essa abordagem elegante, inventada por Richard Hamming em 1950, permanece fundamental para tudo, da memória ECC aos QR codes e à comunicação com o espaço profundo.


Leitura complementar

  • The Art of Doing Science and Engineering de Richard Hamming — O livro que inspirou este artigo
  • A Mathematical Theory of Communication de Claude Shannon (1948) — A base da teoria da informação
  • Interactive visualization of error-correcting codes — O excelente vídeo do 3Blue1Brown

Este artigo faz parte da série Explorações Interativas, que inclui Conway’s Game of Life e Rule 110. Para mais sobre ciência da computação fundamental, veja o arquivo.

Artigos relacionados

Boids to Agents: Flocking Rules for AI Systems

Craig Reynolds' 1986 boids algorithm produces flocking from three local rules. The same principles and failure modes app…

15 min de leitura

GLSL for Builders: A Shader Lab You Can Actually Use

A practical GLSL playground with live controls for learning shader intuition fast. Presets, uniform manipulation, and ze…

16 min de leitura

Signal Scoring Pipeline: Deterministic Knowledge Triage

A 733-line Python pipeline that scores notes across four dimensions and routes 7,700+ items deterministically. The algor…

19 min de leitura