Algoritmo de Luhn: como funciona passo a passo
Entenda o algoritmo de Luhn com um passo a passo e exemplo numérico. Saiba como validar números de cartão e use nosso validador de cartão para testar instantaneamente.
O algoritmo de Luhn é uma rotina simples e eficiente usada para detectar erros comuns de digitação em números de identificação, como números de cartão de crédito. Em uma frase: ele calcula um dígito verificador que permite identificar sequências com trocas ou omissões simples.
Quando você precisa validar rapidamente um número de cartão no frontend ou numa API, usar o Luhn é uma primeira linha de defesa leve e imediata. Para testar um número na prática, use nosso validador de cartão em /ferramentas/validador-cartao, ele aplica Luhn automaticamente e mostra o motivo da rejeição.
O que é o algoritmo de Luhn (visão rápida)
O Luhn, também chamado de "mod 10", é um algoritmo projetado para detectar erros de digitação (um dígito trocado ou faltando). Ele não é uma proteção contra fraudes sofisticadas, serve para garantir que o número segue uma estrutura plausível.
Quando e por que usar o Luhn
- Validação inicial de números de cartão no frontend: evita chamadas desnecessárias ao servidor.
- Filtragem de dados antes de salvar em banco ou enviar para gateways.
- Geração de dados de teste: combine Luhn com um gerador de sequência (por exemplo, nosso /ferramentas/gerador-senha para senhas seguras) quando precisar de dados consistentes.
Passo a passo do Luhn com exemplo numérico
Usaremos o exemplo clássico que aparece na literatura: calcular o dígito verificador para a sequência 7992739871 e mostrar a validação do número completo 79927398713.
1) Escreva o número sem o dígito verificador: 7992739871
2) Comece da direita para a esquerda. Duplique cada segundo dígito (ou seja, os dígitos nas posições pares contando da direita). Para 7 9 9 2 7 3 9 8 7 1:
- Da direita pra esquerda: 1 (posição 1), 7 (2), 8 (3), 9 (4), 3 (5), 7 (6), 2 (7), 9 (8), 9 (9), 7 (10)
- Dobramos posições pares: posições 2,4,6,8,10 => dígitos 7,9,7,9,7 tornam-se 14,18,14,18,14
3) Se o resultado da duplicação for maior que 9, subtraia 9 (ou some os dígitos). Assim:
- 14 → 1 + 4 = 5 (ou 14 - 9 = 5)
- 18 → 9
- 14 → 5
- 18 → 9
- 14 → 5
4) Agora some todos os dígitos não dobrados com os transformados:
- Dígitos não dobrados (posições ímpares da direita): 1,8,3,2,9 → soma = 23
- Dígitos transformados: 5,9,5,9,5 → soma = 33
- Soma total = 23 + 33 = 56
5) O dígito verificador é o número que, somado à soma total, torna a soma um múltiplo de 10. Neste caso: 56 + X ≡ 0 (mod 10). Logo X = 4.
Portanto, o número completo fica 79927398714? Calma, atenção ao exemplo clássico: geralmente a entrada já inclui o dígito final 3 e o número final válido é 79927398713. Vamos mostrar a validação do número completo 79927398713:
Validação de 79927398713 (toda a sequência já com dígito)
- Aplique o mesmo processo em toda a sequência. Se a soma total for múltiplo de 10, o número é válido. No caso de 79927398713, a soma dá 70, que é múltiplo de 10, portanto válido.
Observação: há variações na ordem de dobrar (algumas implementações dobram começando do segundo dígito da esquerda). O importante é ser consistente: sempre conte a partir da direita.
Implementação prática (exemplo em JavaScript)
Abaixo um trecho simples que você pode usar em frontend ou Node.js para validar números com Luhn.
``javascript
function luhnValidate(numberStr) {
const digits = numberStr.replace(/\D/g, '').split('').map(Number);
let sum = 0;
let double = false; // começa do último dígito
for (let i = digits.length - 1; i >= 0; i--) {
let d = digits[i];
if (double) {
d = d * 2;
if (d > 9) d -= 9;
}
sum += d;
double = !double;
}
return sum % 10 === 0;
}
// Exemplo
console.log(luhnValidate('79927398713')); // true
``
Explicação curta do código:
- Removemos tudo que não é dígito.
- Iteramos da direita pra esquerda, alternando a operação de duplicar.
- Subtraímos 9 quando o dobro excede 9 (equivalente a somar os dígitos do produto).
- Número válido quando a soma é múltiplo de 10.
Testando e usando o validador de cartão
Para uso prático, integre a rotina acima no seu formulário de pagamento ou API. No cliente web, faça a checagem antes de enviar o cartão para o servidor, assim você reduz requisições inválidas.
Se preferir uma solução pronta, use nosso validador de cartão em /ferramentas/validador-cartao. Ele aplica Luhn automaticamente, identifica o tipo do cartão (quando possível) e informa se o número está estruturalmente correto.
Boas práticas e limitações do Luhn
- Luhn detecta erros simples (troca de dígitos adjacentes, dígito faltando), mas não protege contra números gerados maliciosamente. Para segurança real, combine com:
2) Autenticação do emissor via gateway (tokenização, 3DS).
3) Verificação de CVV e validade.
- Não use Luhn como único critério para aceitar pagamentos ou cadastros.
- Para outros documentos (CPF/CNPJ), existem algoritmos próprios, não aplique Luhn diretamente.
Conclusão
O Luhn é uma validação leve, fácil de implementar e útil para filtrar números inválidos logo no cliente. Para testar rapidamente, use nosso validador de cartão em /ferramentas/validador-cartao. Se precisar gerar dados de teste combinados com senhas seguras, nosso /ferramentas/gerador-senha complementa a rotina.
FAQ
O algoritmo de Luhn detecta todos os cartões inválidos?
Não. Luhn detecta muitos erros de digitação comuns, mas não protege contra fraudes ou números gerados propositalmente válidos. Combine Luhn com validação do emissor e checagens do gateway.
Como calcular o dígito verificador de um número com Luhn?
Calcule a soma conforme o passo a passo: dobre cada segundo dígito da direita, subtraia 9 quando necessário, some tudo e encontre o valor que completa um múltiplo de 10. Esse valor é o dígito verificador.
Posso usar o Luhn para validar CPF ou CNPJ?
Não. CPF e CNPJ usam algoritmos de verificação diferentes (módulo 11 com pesos específicos). Use validadores próprios para esses documentos.
O que fazer se um número falhar no teste Luhn?
Mostre uma mensagem clara ao usuário (ex.: “Número de cartão inválido, verifique os dígitos”) e ofereça correção inline. No backend, registre a tentativa e aplique verificações adicionais antes de rejeitar uma transação.
Referências
- Descrição do algoritmo (Luhn) e histórico: https://en.wikipedia.org/wiki/Luhn_algorithm
