Luhn-algoritmens kalkylator
Luhn-algoritmens kalkylator
Introduktion
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.
Hur Luhn-algoritmen fungerar
Luhn-algoritmen fungerar enligt följande:
- Från den högra siffran (exklusive kontrollsiffran) och rör dig åt vänster, dubbla värdet av varje andra siffra.
- Om resultatet av denna dubbleringsoperation är större än 9, subtrahera 9 från resultatet.
- Summera alla siffror i den resulterande sekvensen.
- Om totalen modulo 10 är lika med 0 (om totalen slutar på noll), då är numret giltigt enligt Luhn-formeln; annars är det inte giltigt.
Här är en visuell representation av Luhn-algoritmen:
Formel
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.
Användningsområden
Luhn-algoritmen har olika tillämpningar inom olika områden:
- Validering av kreditkort: De flesta kreditkortsnummer valideras med hjälp av Luhn-algoritmen.
- Kanadensiska socialförsäkringsnummer: Luhn-algoritmen används för att verifiera giltigheten av dessa identifieringsnummer.
- IMEI-nummer: Mobiltelefonens IMEI-nummer innehåller en kontrollsiffra som valideras av Luhn-algoritmen.
- Nationella leverantörsidentifieringsnummer (NPI): Används inom det amerikanska sjukvårdssystemet, dessa nummer valideras med hjälp av Luhn-algoritmen.
- ISBN: Vissa ISBN-10-nummer använder en variant av Luhn-algoritmen för validering.
Alternativ
Även om Luhn-algoritmen är allmänt använd, finns det andra kontrollsumma-algoritmer för olika syften:
- Damm-algoritmen: En annan kontrollsiffra-algoritm som upptäcker alla enstaka sifferfel och alla intilliggande transpositionsfel.
- Verhoeff-algoritmen: En mer komplex kontrollsumma-algoritm som fångar alla enstaka sifferfel och de flesta transpositionsfel.
- ISBN-13 kontrollsiffra: Använder en annan algoritm än ISBN-10, som baseras på Luhn-algoritmen.
Historia
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.
Implementeringsexempel
Här är några kodexempel för att implementera Luhn-algoritmen i olika programmeringsspråk:
import random
def luhn_validate(number):
digits = [int(d) for d in str(number)]
checksum = 0
for i in range(len(digits) - 1, -1, -1):
d = digits[i]
if (len(digits) - i) % 2 == 0:
d = d * 2
if d > 9:
d -= 9
checksum += d
return checksum % 10 == 0
def generate_valid_number(length):
digits = [random.randint(0, 9) for _ in range(length - 1)]
checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
check_digit = (10 - (checksum % 10)) % 10
return int(''.join(map(str, digits + [check_digit])))
## Exempel på användning:
print(luhn_validate(4532015112830366)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # Genererar ett giltigt 16-siffrigt nummer
Kantsituationer och särskilda överväganden
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.
Numeriska exempel
-
Giltigt kreditkortsnummer:
- Nummer: 4532015112830366
- Luhn-kontroll: Giltig
-
Ogiltigt kreditkortsnummer:
- Nummer: 4532015112830367
- Luhn-kontroll: Ogiltig
-
Giltigt kanadensiskt socialförsäkringsnummer:
- Nummer: 046 454 286
- Luhn-kontroll: Giltig
-
Ogiltigt IMEI-nummer:
- Nummer: 490154203237518
- Luhn-kontroll: Ogiltig
Testfall
För att verifiera implementeringen av Luhn-algoritmen kan du använda följande testfall:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Testa genererade nummer
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Alla tester passerade!")
test_luhn_algorithm()
Referenser
- Luhn, H. P. (1960). "Computer for Verifying Numbers". US Patent 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". International Organization for Standardization. Hämtad 2 augusti 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.