Validera och generera nummer med hjälp av Luhn-algoritmen, som vanligtvis används för kreditkortsnummer, kanadensiska socialförsäkringsnummer och andra identifikationsnummer. Testa om ett nummer klarar Luhn-kontrollen eller generera giltiga nummer som följer algoritmen.
Luhn-algoritmen, även känd som "modulus 10" eller "mod 10"-algoritmen, är en enkel kontrollsummaformel som används för att validera en mängd identifieringsnummer, såsom kreditkortsnummer, kanadensiska socialförsäkringsnummer, IMEI-nummer och nationella leverantörsidentifieringsnummer i USA. Denna kalkylator gör det möjligt för dig att validera nummer med hjälp av Luhn-algoritmen och generera giltiga nummer som passerar Luhn-kontrollen.
Luhn-algoritmen fungerar enligt följande:
Här är en visuell representation av Luhn-algoritmen:
Luhn-algoritmen kan uttryckas matematiskt enligt följande:
Låt vara den :te siffran, räknat från den högra siffran (exklusive kontrollsiffran) och rörande sig åt vänster. Då väljs kontrollsiffran så att:
Där är modulo-operationen.
Luhn-algoritmen har olika tillämpningar inom olika områden:
Även om Luhn-algoritmen är allmänt använd, finns det andra kontrollsumma-algoritmer för olika syften:
Luhn-algoritmen skapades av Hans Peter Luhn, en IBM-datorforskare, 1954. Luhn var en pionjär inom informationsvetenskap och krediteras med flera innovationer, inklusive KWIC (Key Word In Context) indexeringssystem.
Algoritmen designades ursprungligen för att skydda mot oavsiktliga fel, inte illvilliga attacker. Det är viktigt att notera att även om Luhn-algoritmen kan upptäcka många vanliga fel, är det inte en säker form av kryptering och bör inte förlita sig på för dataskydd.
Trots sin ålder förblir Luhn-algoritmen allmänt använd på grund av sin enkelhet och effektivitet i att fånga vanliga transkriptionsfel.
Här är några kodexempel för att implementera Luhn-algoritmen i olika programmeringsspråk:
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## Exempel på användning:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Genererar ett giltigt 16-siffrigt nummer
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// Exempel på användning:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genererar ett giltigt 16-siffrigt nummer
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)); // Genererar ett giltigt 16-siffrigt nummer
47 }
48}
49
När du implementerar Luhn-algoritmen, överväg följande kantsituationer och särskilda överväganden:
Inmatningsvalidering: Säkerställ att inmatningen är en giltig nummerserie. Icke-siffriga tecken bör hanteras på lämpligt sätt (antingen tas bort eller behandlas som ogiltig inmatning).
Ledande nollor: Algoritmen bör fungera korrekt med nummer som har ledande nollor.
Stora nummer: Var beredd att hantera mycket långa nummer som kan överskrida kapaciteten för standard heltalstyper i vissa programmeringsspråk.
Tom inmatning: Definiera hur din implementation ska hantera tomma strängar eller null-inmatningar.
Icke-standard teckenuppsättningar: I vissa applikationer kan du stöta på nummer som representeras med tecken utanför standard 0-9-intervallet. Definiera hur dessa ska hanteras.
Prestandaöverväganden: För applikationer som behöver validera stora mängder inmatningar snabbt, överväg att optimera algoritmimplementationen.
Giltigt kreditkortsnummer:
Ogiltigt kreditkortsnummer:
Giltigt kanadensiskt socialförsäkringsnummer:
Ogiltigt IMEI-nummer:
För att verifiera implementeringen av Luhn-algoritmen kan du använda följande testfall:
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 genererade nummer
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Alla tester passerade!")
12
13test_luhn_algorithm()
14