Validați și generați numere folosind algoritmul Luhn, utilizat frecvent pentru numerele de carduri de credit, numerele de asigurare socială canadiene și alte numere de identificare. Testați dacă un număr trece verificarea Luhn sau generați numere valide care respectă algoritmul.
Algoritmul Luhn, cunoscut și sub numele de algoritmul "modulus 10" sau "mod 10", este o formulă simplă de verificare utilizată pentru a valida o varietate de numere de identificare, cum ar fi numerele de carduri de credit, numerele de asigurare socială canadiene, numerele IMEI și numerele de identificare a furnizorilor naționali în Statele Unite. Acest calculator vă permite să validați numere folosind algoritmul Luhn și să generați numere valide care trec verificarea Luhn.
Algoritmul Luhn funcționează astfel:
Iată o reprezentare vizuală a algoritmului Luhn:
Algoritmul Luhn poate fi exprimat matematic astfel:
Fie cifra -a, numărând de la cifra din dreapta (excluzând cifra de verificare) și mergând spre stânga. Atunci cifra de verificare este aleasă astfel încât:
Unde este operația modulo.
Algoritmul Luhn are diverse aplicații în diferite domenii:
Deși algoritmul Luhn este utilizat pe scară largă, există și alte algoritmi de verificare pentru diferite scopuri:
Algoritmul Luhn a fost creat de Hans Peter Luhn, un om de știință informatician de la IBM, în 1954. Luhn a fost un pionier în domeniul științei informației și este creditat cu mai multe inovații, inclusiv sistemul de indexare KWIC (Cuvânt cheie în context).
Algoritmul a fost inițial conceput pentru a proteja împotriva erorilor accidentale, nu a atacurilor malițioase. Este important de menționat că, deși algoritmul Luhn poate detecta multe erori comune, nu este o formă sigură de criptare și nu ar trebui să fie utilizat pentru scopuri de securitate a datelor.
În ciuda vârstei sale, algoritmul Luhn rămâne utilizat pe scară largă datorită simplității și eficienței sale în prinderea erorilor comune de transcriere.
Iată câteva exemple de cod pentru a implementa algoritmul Luhn în diferite limbaje de programare:
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## Exemplu de utilizare:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Generează un număr valid de 16 cifre
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// Exemplu de utilizare:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Generează un număr valid de 16 cifre
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)); // Generează un număr valid de 16 cifre
47 }
48}
49
Când implementați algoritmul Luhn, luați în considerare următoarele cazuri limită și considerații speciale:
Validarea intrării: Asigurați-vă că intrarea este un șir de numere valid. Caracteristicile non-digit ar trebui să fie gestionate corespunzător (fie eliminate, fie tratate ca intrări invalide).
Zeros la început: Algoritmul ar trebui să funcționeze corect cu numere care au zerouri la început.
Numere mari: Fiți pregătit să gestionați numere foarte lungi care ar putea depăși capacitatea tipurilor standard de integer în unele limbaje de programare.
Intrare goală: Definiți cum ar trebui să gestioneze implementarea dvs. șirurile goale sau intrările nule.
Seturi de caractere non-standard: În unele aplicații, s-ar putea să întâlniți numere reprezentate cu caractere în afara intervalului standard 0-9. Definiți cum ar trebui să fie gestionate acestea.
Considerații de performanță: Pentru aplicațiile care trebuie să valideze rapid un număr mare de intrări, luați în considerare optimizarea implementării algoritmului.
Număr valid de card de credit:
Număr invalid de card de credit:
Număr valid de asigurare socială canadiană:
Număr IMEI invalid:
Pentru a verifica implementarea algoritmului Luhn, puteți folosi următoarele cazuri de testare:
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 # Testați numerele generate
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Toate testele au trecut!")
12
13test_luhn_algorithm()
14