Calculadora gratuita de Luhn mod 10 para validação de cartão de crédito, verificação de IMEI e verificação de identidade. Valide números instantaneamente ou gere dados de teste online.
Verificar se seu número passa na validação Luhn mod 10
Precisa verificar um número de cartão de crédito ou validar um IMEI? O algoritmo de Luhn (ou "algoritmo mod 10") é uma fórmula de checksum que tem sido a base da verificação de pagamentos desde 1954. O cientista da IBM Hans Peter Luhn projetou essa elegante verificação matemática para capturar erros de digitação e transcrição que afetam a entrada manual de dados — como quando você acidentalmente troca dois dígitos ou digita incorretamente um número.
Eis o que o torna inestimável: todas as principais redes de cartão de crédito (Visa, Mastercard, American Express), números de IMEI de dispositivos móveis, Números de Seguro Social Canadenses e identificadores de provedores de saúde dos EUA dependem deste algoritmo. Quando você digita um número de cartão em um formulário de pagamento e ele rejeita instantaneamente um erro, é o verificador de Luhn em ação.
Esta calculadora permite validar qualquer sequência numérica ou gerar dados de teste que passam na verificação — essencial quando você está construindo integrações de pagamento ou testando sistemas de identificação sem usar dados reais de clientes.
Validando números existentes: Digite qualquer sequência numérica—como um cartão de crédito de 16 dígitos ou um IMEI de 15 dígitos—e clique em "Validar". Você verá imediatamente se ele passa na verificação mod 10, além de uma explicação passo a passo de como cada dígito foi processado. Isso é particularmente útil ao depurar formulários de pagamento ou verificar se a entrada de dados foi precisa.
Gerando dados de teste: Mude para o modo "Gerar" para criar números de teste válidos de qualquer comprimento. Esses números passam na verificação de Luhn, mas não são cartões reais e ativos—tornando-os perfeitos para ambientes de desenvolvimento onde você precisa de casos de teste realistas sem tocar em credenciais de pagamento reais.
Entendendo o processo: A visualização mostra exatamente o que acontece com cada dígito: quais são dobrados, quando 9 é subtraído, e como a soma final determina a validade. Achei esse feedback visual inestimável ao explicar o algoritmo para colegas de equipe ou depurar problemas de implementação.
O algoritmo processa números da direita para a esquerda, aplicando um padrão simples que detecta a maioria dos erros de digitação:
Comece pela direita: Pegue cada dígito, movendo para a esquerda. A cada dois dígitos, um é dobrado (são os que estão em posições pares ao contar da direita).
Lidar com dobras grandes: Quando a duplicação produz um número maior que 9, subtraia 9. Isso é matematicamente equivalente a somar os dígitos individuais (18 se torna 1+8=9).
Some tudo: Adicione todos os dígitos processados—tanto os dobrados/ajustados quanto os inalterados.
Verifique a divisibilidade: Se a soma for divisível por 10 (terminar em 0), o número é válido. Qualquer outro resultado significa que há um erro.
O que é inteligente nessa abordagem é como ela detecta erros comuns. Se você trocar dois dígitos adjacentes ou digitar incorretamente um número, a soma de verificação quase sempre muda. O algoritmo não detectará todos os erros possíveis—erros gêmeos como trocar 22 por 55 passam despercebidos—mas detecta aproximadamente 98% dos erros aleatórios de dígito único e cerca de 90% das transposições adjacentes.
Aqui está uma representação visual do processo:
Para aqueles que preferem notação formal, aqui está a expressão matemática:
Seja o -ésimo dígito, contando a partir do dígito mais à direita (excluindo o dígito de verificação) e movendo para a esquerda. Então o dígito de verificação é escolhido de modo que:
Onde é a operação de módulo.
Processamento de pagamentos: Todas as principais redes de cartão—Visa, Mastercard, American Express, Discover—usam a verificação de Luhn como primeira linha de defesa contra erros de digitação. Ao construir um formulário de checkout, implementar a validação de Luhn no lado do cliente ajuda os usuários a não submeterem números obviamente incorretos e reduz chamadas desnecessárias de API para gateways de pagamento.
Rastreamento de dispositivos móveis: Números IMEI em telefones e tablets incluem um dígito de verificação de Luhn. Isso se torna crucial na gestão da cadeia de suprimentos e sistemas de autenticação de dispositivos—já vi sistemas de armazém rejeitarem imediatamente varreduras de IMEI inválidas, prevenindo erros de envio antes que aconteçam.
Identificadores de saúde: O sistema de Identificador Nacional de Provedor (NPI) dos EUA valida números de provedor usando este algoritmo. Com milhões de transações de saúde diariamente, capturar erros de transcrição em IDs de provedores previne atrasos de faturamento e reduz rejeições de reclamações.
Identificação governamental: Números de Seguro Social canadenses incorporam validação de Luhn. O algoritmo fornece uma verificação rápida de sanidade sem exigir consultas em banco de dados, tornando-o eficiente para cenários de verificação de alto volume.
Sistemas de livros legados: Algumas implementações de ISBN-10 usam uma variante de Luhn. Embora ISBN-13 use um algoritmo diferente de dígito de verificação, sistemas antigos de biblioteca e inventário ainda dependem da validação baseada em Luhn.
Vamos validar o número 4532015112830366:
Testando 490154203237518 (o último dígito está intencionalmente errado):
A soma não termina em zero, então o algoritmo sinaliza isso como incorreto. Para torná-lo válido, o último dígito deveria ser 1, o que traria a soma para 60—perfeitamente divisível por 10. Esta é exatamente a forma como o algoritmo captura erros de transcrição em identificadores de dispositivos.
O algoritmo de Luhn é popular por ser simples de implementar, mas existem alternativas mais sofisticadas quando você precisa de uma detecção de erros mais forte:
Algoritmo de Verhoeff: Detecta todos os erros de dígito único e quase todos os erros de transposição, incluindo os casos de dígitos gêmeos que Luhn não detecta (como 22↔55). A contrapartida é o aumento da complexidade—requer tabelas de consulta com operações de multiplicação e permutação. Use este quando a precisão dos dados for crítica e a sobrecarga computacional não for uma preocupação.
Algoritmo de Damm: Detecta todos os erros de dígito único e todas as transposições adjacentes sem exceção. É baseado em uma operação de quase-grupo especialmente construída que garante cobertura completa. A implementação usa uma única tabela de consulta, tornando-o mais simples que Verhoeff, mas ainda mais complexo que Luhn.
Dígito de verificação ISBN-13: Usa um algoritmo de módulo 10 ponderado diferente tanto de Luhn quanto de ISBN-10. Os pesos alternam entre 1 e 3, o que fornece boa detecção de erros especificamente para identificadores de livros. Isso substituiu o sistema ISBN-10 mais antigo (que usava Luhn) quando a indústria precisava de mais espaço de identificadores.
Hans Peter Luhn desenvolveu este algoritmo na IBM em 1954, durante os primeiros dias do processamento de dados automatizado. Luhn já era conhecido por trabalhos pioneiros em recuperação de informações — seu sistema de indexação KWIC (Key Word In Context) influenciou como pesquisamos documentos até hoje — mas o algoritmo mod 10 se tornou sua contribuição mais duradoura.
Aqui está a distinção crucial: Luhn projetou isso para detecção de erros, não segurança. Nos anos 1950, o problema eram erros em cartões perfurados e erros de transcrição manual, não fraudes digitais. O algoritmo captura erros acidentais brilhantemente — mas não é criptografia. Um número Luhn válido não significa que o cartão esteja ativo, financiado ou pertença à pessoa que o está usando.
O notável é como um algoritmo de 70 anos ainda serve ao seu propósito original. Processadores de pagamento adicionam camadas de segurança moderna (tokenização, verificação CVV, 3D Secure), mas aquela verificação inicial de Luhn no lado do cliente ainda impede milhões de erros óbvios diariamente, antes que desperdicem largura de banda em chamadas de gateway de pagamento.
Aqui está como implementar validação e geração de Luhn em Python, JavaScript e Java. Esses exemplos priorizam legibilidade mantendo eficiência:
1import random
2
3def luhn_validate(number):
4 digits = [int(d) for d in str(number)]
5 checksum = 0
6 for i in range(len(digits) - 1, -1, -1):
7 d = digits[i]
8 if (len(digits) - i) % 2 == 0:
9 d = d * 2
10 if d > 9:
11 d -= 9
12 checksum += d
13 return checksum % 10 == 0
14
15def generate_valid_number(length):
16 digits = [random.randint(0, 9) for _ in range(length - 1)]
17 checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
18 check_digit = (10 - (checksum % 10)) % 10
19 return int(''.join(map(str, digits + [check_digit])))
20
21## Exemplo de uso:
22
23print(luhn_validate(4532015112830366)) # Verdadeiro
24print(luhn_validate(4532015112830367)) # Falso
25print(generate_valid_number(16)) # Gera um número válido de 16 dígitos
261function luhnValidate(number) {
2 const digits = number.toString().split('').map(Number);
3 let checksum = 0;
4 for (let i = digits.length - 1; i >= 0; i--) {
5 let d = digits[i];
6 if ((digits.length - i) % 2 === 0) {
7 d *= 2;
8 if (d > 9) d -= 9;
9 }
10 checksum += d;
11 }
12 return checksum % 10 === 0;
13}
14
15function generateValidNumber(length) {
16 const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
17 const checksum = digits.reduce((sum, digit, index) => {
18 if ((length - 1 - index) % 2 === 0) {
19 digit *= 2;
20 if (digit > 9) digit -= 9;
21 }
22 return sum + digit;
23 }, 0);
24 const checkDigit = (10 - (checksum % 10)) % 10;
25 return parseInt(digits.join('') + checkDigit);
26}
27
28// Exemplo de uso:
29console.log(luhnValidate(4532015112830366)); // verdadeiro
30console.log(luhnValidate(4532015112830367)); // falso
31console.log(generateValidNumber(16)); // Gera um número válido de 16 dígitos
321import java.util.Random;
2
3public class LuhnValidator {
4 public static boolean luhnValidate(long number) {
5 String digits = String.valueOf(number);
6 int checksum = 0;
7 boolean isEven = true;
8 for (int i = digits.length() - 1; i >= 0; i--) {
9 int digit = Character.getNumericValue(digits.charAt(i));
10 if (isEven) {
11 digit *= 2;
12 if (digit > 9) digit -= 9;
13 }
14 checksum += digit;
15 isEven = !isEven;
16 }
17 return checksum % 10 == 0;
18 }
19
20 public static long generateValidNumber(int length) {
21 Random random = new Random();
22 long[] digits = new long[length - 1];
23 for (int i = 0; i < length - 1; i++) {
24 digits[i] = random.nextInt(10);
25 }
26 long checksum = 0;
27 for (int i = digits.length - 1; i >= 0; i--) {
28 long digit = digits[i];
29 if ((length - 1 - i) % 2 == 0) {
30 digit *= 2;
31 if (digit > 9) digit -= 9;
32 }
33 checksum += digit;
34 }
35 long checkDigit = (10 - (checksum % 10)) % 10;
36 long result = 0;
37 for (long digit : digits) {
38 result = result * 10 + digit;
39 }
40 return result * 10 + checkDigit;
41 }
42
43 public static void main(String[] args) {
44 System.out.println(luhnValidate(4532015112830366L)); // verdadeiro
45 System.out.println(luhnValidate(4532015112830367L)); // falso
46 System.out.println(generateValidNumber(16)); // Gera um número válido de 16 dígitos
47 }
48}
49Ao implementar validação Luhn em sistemas de produção, fique atento a estes problemas comuns:
Sanitização de entrada: Entradas do mundo real frequentemente incluem espaços, hífens ou outros caracteres de formatação (como "4532-0151-1128-3036"). Remova estes antes da validação em vez de rejeitar a entrada—os usuários costumam copiar números formatados. No entanto, rejeite caracteres alfabéticos imediatamente, pois indicam entrada genuinamente inválida.
Zeros à esquerda são importantes: Um número como "0123456789" é diferente de "123456789" para fins de Luhn. Zeros à esquerda devem ser preservados durante a validação. Isso confunde desenvolvedores que convertem para inteiros primeiro—use operações de string em vez disso.
Limites de inteiros de linguagem: Cartões de crédito normalmente têm no máximo 19 dígitos, o que cabe em um inteiro de 64 bits. Mas se estiver validando identificadores de comprimento arbitrário, evite converter para inteiros. Processe como strings ou arrays de dígitos para prevenir estouro.
Entrada vazia ou nula: Defina explicitamente seu comportamento: lance uma exceção, retorne falso ou trate com elegância? Descobri que retornar falso faz mais sentido para funções de validação, mas endpoints de API podem querer retornar um erro 400 com uma mensagem descritiva.
Desempenho em escala: Para validação em lote (como processar arquivos CSV carregados com milhares de números de cartão), o algoritmo básico já é bastante rápido—O(n) onde n é a contagem de dígitos. O gargalo geralmente é E/S, não computação. Foque a otimização no parsing de arquivo e relatório de erros, em vez da lógica de validação em si.
Use estes para testar sua implementação:
Números válidos:
4532015112830366 — Formato Visa (16 dígitos)046454286 — Formato SIN canadense (9 dígitos)79927398713 — Número válido genéricoNúmeros inválidos:
4532015112830367 — Erro em um dígito490154203237518 — Dígito de verificação incorreto79927398714 — Último dígito incorretoEsses casos de teste cobrem cenários comuns: números válidos padrão, erros de dígito único e dígitos de verificação incorretos.
Aqui está uma suíte de testes abrangente para validar sua implementação:
1def test_luhn_algorithm():
2 # Testes básicos de validação
3 assert luhn_validate(4532015112830366) == True
4 assert luhn_validate(4532015112830367) == False
5 assert luhn_validate(79927398713) == True
6 assert luhn_validate(79927398714) == False
7
8 # Testar se números gerados passam na validação
9 for _ in range(10):
10 generated = generate_valid_number(16)
11 assert luhn_validate(generated) == True, f"Número gerado {generated} falhou na validação"
12
13 # Caso de borda: dígito único
14 assert luhn_validate(0) == True # 0 mod 10 = 0
15
16 # Caso de borda: zeros à esquerda preservados
17 assert luhn_validate("0000000000000000") != luhn_validate(0)
18
19 print("Todos os testes passaram!")
20
21test_luhn_algorithm()
22O algoritmo de Luhn valida números de identificação, incluindo cartões de crédito (Visa, Mastercard, Amex), números IMEI de dispositivos móveis, Números de Seguro Social canadenses e números NPI de saúde dos EUA. Ele detecta erros comuns de entrada de dados — como dígitos digitados incorretamente ou números trocados acidentalmente — antes que causem erros de processamento ou transações malsucedidas.
Luhn detecta aproximadamente 98% de erros de dígito único e cerca de 90% de erros de transposição adjacente (como digitar "12" em vez de "21"). No entanto, ele não detecta erros gêmeos onde ambos os dígitos são iguais (22→55) e transposições de salto (101→404). Para a maioria das aplicações práticas envolvendo entrada manual de dados, essa taxa de detecção é suficiente.
Sim, a validação de Luhn funciona completamente offline — é pura matemática que não requer pesquisas em banco de dados ou chamadas de API. Isso o torna perfeito para validação do lado do cliente em formulários web, reduzindo a carga do servidor e fornecendo feedback instantâneo aos usuários. Mas lembre-se: um número válido de Luhn não significa que o cartão esteja ativo ou tenha crédito disponível.
Não — Luhn é detecção de erros, não segurança. Ele verifica apenas o formato matemático. Uma verificação de Luhn aprovada não confirma que o cartão é real, ativo, financiado ou pertence ao usuário. A segurança moderna de pagamentos requer várias camadas: verificação de CVV/CVC, validação de endereço (AVS), autenticação 3D Secure e tokenização. Luhn é apenas a primeira verificação de sanidade.
Toda linguagem de propósito geral pode implementar Luhn — é um algoritmo simples que requer apenas aritmética básica e loops. Python, JavaScript, Java, C++, C#, PHP, Ruby, Go, Rust e Swift lidam com isso facilmente em 10-20 linhas de código. Algumas linguagens têm bibliotecas de terceiros, mas o algoritmo é simples o suficiente para que a maioria dos desenvolvedores o implemente diretamente.
A etapa final verifica se a soma dos dígitos é divisível por 10 usando a operação de módulo (soma % 10 == 0). "Mod 10" refere-se a essa verificação de módulo 10. Se o resto for zero ao dividir por 10, o número passa — caso contrário, falha. Essa propriedade matemática é o que faz o algoritmo funcionar.
Sim — você pode gerar números que passam na validação de Luhn para testar formulários de pagamento durante o desenvolvimento. Esses não são cartões reais ou ativos; eles apenas satisfazem o formato matemático. Isso é legal e necessário para testes, mas tentar usar números gerados para compras reais é fraude. A maioria dos gateways de pagamento oferece números de cartão de teste oficiais para ambientes de preparação.
Luhn não detectará: erros gêmeos (22↔55), transposições de salto (101↔404), erros fonéticos (60↔06 em alguns casos) ou múltiplos erros simultâneos. Ele também não fornece segurança criptográfica — formato válido não significa cartão válido. Apesar dessas limitações, sua simplicidade e taxa de detecção de erros superior a 90% o tornam prático para sistemas de pagamento do mundo real quando combinado com outros métodos de verificação.
Use a calculadora acima para validar números de cartão de crédito, gerar dados de teste para ambientes de desenvolvimento ou explorar como o algoritmo mod 10 processa cada dígito. A visualização passo a passo ajuda a depurar problemas de implementação e explica os resultados de validação para partes interessadas não técnicas.
Seja você quem está construindo um formulário de pagamento, depurando um sistema de validação de IMEI ou apenas aprendendo sobre algoritmos de checksum, esta ferramenta fornece o feedback instantâneo e a transparência técnica que você precisa.
Luhn, H. P. (1960). "Computador para Verificação de Números". Patente dos EUA 2.950.048 - A patente original que descreve o algoritmo.
ISO/IEC 7812-1:2017 - Cartões de Identificação - Padrão internacional para sistemas de numeração de cartões de identificação, que especifica o uso do algoritmo de Luhn para cartões de pagamento.
Gallian, Joseph (1991). "A Matemática dos Números de Identificação" - Análise acadêmica de diversos algoritmos de dígitos de verificação, incluindo Luhn, publicada no Journal of College Mathematics.
Padrão de Segurança de Dados da Indústria de Cartões de Pagamento (PCI DSS) - Padrões de segurança que regulam como os dados de cartões de pagamento devem ser tratados, fornecendo contexto para onde o algoritmo de Luhn se encaixa na pilha de segurança.
Descubra mais ferramentas que podem ser úteis para o seu fluxo de trabalho