Calculadora de Validação do Algoritmo de Luhn
Valide e gere números usando o algoritmo de Luhn, comumente utilizado para números de cartões de crédito, Números de Seguro Social Canadense e outros números de identificação. Teste se um número passa na verificação de Luhn ou gere números válidos que estejam em conformidade com o algoritmo.
Calculadora do Algoritmo de Luhn
Documentação
Calculadora do Algoritmo de Luhn
Introdução
O algoritmo de Luhn, também conhecido como algoritmo de "módulo 10" ou "mod 10", é uma fórmula simples de verificação usada para validar uma variedade de números de identificação, como números de cartões de crédito, Números de Seguro Social do Canadá, números IMEI e números de Identificador Nacional de Provedor nos Estados Unidos. Esta calculadora permite que você valide números usando o algoritmo de Luhn e gere números válidos que passam na verificação de Luhn.
Como Funciona o Algoritmo de Luhn
O algoritmo de Luhn funciona da seguinte maneira:
- Começando pelo dígito mais à direita (excluindo o dígito de verificação) e movendo-se para a esquerda, dobre o valor de cada segundo dígito.
- Se o resultado dessa operação de duplicação for maior que 9, subtraia 9 do resultado.
- Some todos os dígitos na sequência resultante.
- Se o total módulo 10 for igual a 0 (se o total terminar em zero), então o número é válido de acordo com a fórmula de Luhn; caso contrário, não é válido.
Aqui está uma representação visual do algoritmo de Luhn:
Fórmula
O algoritmo de Luhn pode ser expresso matematicamente da seguinte forma:
Seja o -ésimo dígito, contando a partir do dígito mais à direita (excluindo o dígito de verificação) e movendo-se para a esquerda. Então o dígito de verificação é escolhido de forma que:
Onde é a operação de módulo.
Casos de Uso
O algoritmo de Luhn tem várias aplicações em diferentes campos:
- Validação de Cartão de Crédito: A maioria dos números de cartões de crédito é validada usando o algoritmo de Luhn.
- Números de Seguro Social do Canadá: O algoritmo de Luhn é usado para verificar a validade desses números de identificação.
- Números IMEI: Os números IMEI de telefones móveis incorporam um dígito de verificação validado pelo algoritmo de Luhn.
- Números de Identificador Nacional de Provedor (NPI): Usados no sistema de saúde dos Estados Unidos, esses números são validados usando o algoritmo de Luhn.
- ISBNs: Alguns números ISBN-10 usam uma variante do algoritmo de Luhn para validação.
Alternativas
Embora o algoritmo de Luhn seja amplamente utilizado, existem outros algoritmos de verificação para diferentes propósitos:
- Algoritmo de Damm: Outro algoritmo de dígito de verificação que detecta todos os erros de um dígito e todos os erros de transposição adjacentes.
- Algoritmo de Verhoeff: Um algoritmo de verificação mais complexo que captura todos os erros de um dígito e a maioria dos erros de transposição.
- Dígito de verificação ISBN-13: Usa um algoritmo diferente do ISBN-10, que é baseado no algoritmo de Luhn.
História
O algoritmo de Luhn foi criado por Hans Peter Luhn, um cientista da computação da IBM, em 1954. Luhn foi um pioneiro no campo da ciência da informação e é creditado com várias inovações, incluindo o sistema de indexação KWIC (Key Word In Context).
O algoritmo foi originalmente projetado para proteger contra erros acidentais, não ataques maliciosos. É importante notar que, embora o algoritmo de Luhn possa detectar muitos erros comuns, não é uma forma segura de criptografia e não deve ser confiado para fins de segurança de dados.
Apesar de sua idade, o algoritmo de Luhn continua amplamente utilizado devido à sua simplicidade e eficácia em capturar erros comuns de transcrição.
Exemplos de Implementação
Aqui estão alguns exemplos de código para implementar o algoritmo de Luhn em várias linguagens de programação:
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:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Gera um número válido de 16 dígitos
25
1function 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)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Gera um número válido de 16 dígitos
32
1import 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)); // true
45 System.out.println(luhnValidate(4532015112830367L)); // false
46 System.out.println(generateValidNumber(16)); // Gera um número válido de 16 dígitos
47 }
48}
49
Casos de Bordas e Considerações Especiais
Ao implementar o algoritmo de Luhn, considere os seguintes casos de borda e considerações especiais:
-
Validação de Entrada: Certifique-se de que a entrada seja uma string numérica válida. Caracteres não numéricos devem ser tratados adequadamente (removidos ou considerados como entrada inválida).
-
Zeros à Frente: O algoritmo deve funcionar corretamente com números que têm zeros à frente.
-
Números Grandes: Esteja preparado para lidar com números muito longos que podem exceder a capacidade dos tipos de inteiros padrão em algumas linguagens de programação.
-
Entrada Vazia: Defina como sua implementação deve lidar com strings vazias ou entradas nulas.
-
Conjuntos de Caracteres Não Padrão: Em algumas aplicações, você pode encontrar números representados com caracteres fora do intervalo padrão de 0-9. Defina como esses devem ser tratados.
-
Considerações de Desempenho: Para aplicações que precisam validar grandes quantidades de entradas rapidamente, considere otimizar a implementação do algoritmo.
Exemplos Numéricos
-
Número Válido de Cartão de Crédito:
- Número: 4532015112830366
- Verificação de Luhn: Válido
-
Número Inválido de Cartão de Crédito:
- Número: 4532015112830367
- Verificação de Luhn: Inválido
-
Número Válido de Seguro Social Canadense:
- Número: 046 454 286
- Verificação de Luhn: Válido
-
Número IMEI Inválido:
- Número: 490154203237518
- Verificação de Luhn: Inválido
Casos de Teste
Para verificar a implementação do algoritmo de Luhn, você pode usar os seguintes casos de teste:
1def test_luhn_algorithm():
2 assert luhn_validate(4532015112830366) == True
3 assert luhn_validate(4532015112830367) == False
4 assert luhn_validate(79927398713) == True
5 assert luhn_validate(79927398714) == False
6
7 # Teste números gerados
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Todos os testes passaram!")
12
13test_luhn_algorithm()
14
Referências
- Luhn, H. P. (1960). "Computer for Verifying Numbers". Patente dos EUA 2,950,048.
- Gallian, Joseph. "The Mathematics of Identification Numbers." The College Mathematics Journal, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". Organização Internacional de Normalização. Acessado em 2 de agosto de 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.
Feedback
Clique no feedback toast para começar a dar feedback sobre esta ferramenta