Luhn algoritmus kalkulátor
Luhn Algoritmus Számológép
Bevezetés
A Luhn algoritmus, más néven "modulus 10" vagy "mod 10" algoritmus, egy egyszerű ellenőrző számítási formula, amelyet különféle azonosító számok, például hitelkártya számok, kanadai társadalombiztosítási számok, IMEI számok és az Egyesült Államokban használt Országos Szolgáltató Azonosító számok érvényesítésére használnak. Ez a számológép lehetővé teszi, hogy érvényesítse a számokat a Luhn algoritmus segítségével, és generáljon érvényes számokat, amelyek átmennek a Luhn ellenőrzésen.
Hogyan működik a Luhn algoritmus
A Luhn algoritmus a következőképpen működik:
- A legjobboldali számjegytől (a ellenőrző számjegy kivételével) kezdve, haladjon balra, és duplázza meg minden második számjegy értékét.
- Ha a duplázás eredménye nagyobb, mint 9, vonjon le 9-et az eredményből.
- Összegezze az összes számjegyet az eredményül kapott sorozatban.
- Ha az összeg modulo 10 egyenlő 0-val (ha az összeg nullával végződik), akkor a szám érvényes a Luhn formula szerint; különben nem érvényes.
Itt egy vizuális ábrázolás a Luhn algoritmusról:
Formula
A Luhn algoritmus matematikailag a következőképpen fejezhető ki:
Legyen az -edik számjegy, a legjobboldali számjegytől (a ellenőrző számjegy kivételével) balra haladva. Ekkor az ellenőrző számjegy úgy van kiválasztva, hogy:
Ahol a modulo művelet.
Használati esetek
A Luhn algoritmusnak különböző alkalmazásai vannak különböző területeken:
- Hitelkártya Érvényesítés: A legtöbb hitelkártya számot a Luhn algoritmus segítségével érvényesítenek.
- Kanadai Társadalombiztosítási Számok: A Luhn algoritmust használják ezen azonosító számok érvényességének ellenőrzésére.
- IMEI Számok: A mobiltelefonok IMEI számai tartalmaznak egy ellenőrző számjegyet, amelyet a Luhn algoritmus érvényesít.
- Országos Szolgáltató Azonosító (NPI) Számok: Az Egyesült Államok egészségügyi rendszerében használt számokat a Luhn algoritmus érvényesíti.
- ISBN: Néhány ISBN-10 szám a Luhn algoritmus egy változatát használja az érvényesítéshez.
Alternatívák
Bár a Luhn algoritmus széles körben használt, más ellenőrző algoritmusok is léteznek különböző célokra:
- Damm algoritmus: Egy másik ellenőrző számjegy algoritmus, amely észleli az összes egyjegyű hibát és az összes szomszédos transzpozíciós hibát.
- Verhoeff algoritmus: Egy összetettebb ellenőrző algoritmus, amely észleli az összes egyjegyű hibát és a legtöbb transzpozíciós hibát.
- ISBN-13 ellenőrző számjegy: Más algoritmust használ, mint az ISBN-10, amely a Luhn algoritmuson alapul.
Történelem
A Luhn algoritmust Hans Peter Luhn, az IBM számítástechnikai tudósa alkotta meg 1954-ben. Luhn az információs tudomány területének úttörője, és számos innováció fűződik a nevéhez, beleértve a KWIC (Kulcsszó a Kontextusban) indexelési rendszert.
Az algoritmust eredetileg a véletlen hibák elleni védelemre tervezték, nem pedig rosszindulatú támadások ellen. Fontos megjegyezni, hogy bár a Luhn algoritmus képes észlelni sok gyakori hibát, nem biztonságos titkosítási forma, és nem szabad adatbiztonsági célokra támaszkodni.
Korától függetlenül a Luhn algoritmus továbbra is széles körben használt a egyszerűsége és a közönséges másolási hibák észlelésének hatékonysága miatt.
Megvalósítási Példák
Itt van néhány kód példa a Luhn algoritmus megvalósítására különböző programozási nyelvekben:
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])))
## Példa használat:
print(luhn_validate(4532015112830366)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # Generál egy érvényes 16-jegyű számot
Széljegyzetek és különleges megfontolások
A Luhn algoritmus megvalósításakor vegye figyelembe a következő széljegyzeteket és különleges megfontolásokat:
-
Bemeneti Érvényesítés: Biztosítsa, hogy a bemenet egy érvényes számjegy string legyen. A nem számjegy karaktereket megfelelően kell kezelni (vagy eltávolítani, vagy érvénytelen bemenetként kezelni).
-
Előtag Zérók: Az algoritmusnak helyesen kell működnie a zérókkal kezdődő számokkal.
-
Nagy Számok: Készüljön fel arra, hogy nagyon hosszú számokat kezeljen, amelyek meghaladhatják a standard egész szám típusok kapacitását egyes programozási nyelvekben.
-
Üres Bemenet: Határozza meg, hogyan kell kezelni a üres stringeket vagy null bemeneteket.
-
Nem Szabványos Karakterkészletek: Egyes alkalmazásokban előfordulhat, hogy a számokat a standard 0-9 tartományon kívüli karakterekkel ábrázolják. Határozza meg, hogyan kell ezeket kezelni.
-
Teljesítmény Megfontolások: Azok számára, akiknek gyorsan kell érvényesíteniük nagyszámú bemenetet, fontolja meg az algoritmus megvalósításának optimalizálását.
Szám példák
-
Érvényes Hitelkártya Szám:
- Szám: 4532015112830366
- Luhn Ellenőrzés: Érvényes
-
Érvénytelen Hitelkártya Szám:
- Szám: 4532015112830367
- Luhn Ellenőrzés: Érvénytelen
-
Érvényes Kanadai Társadalombiztosítási Szám:
- Szám: 046 454 286
- Luhn Ellenőrzés: Érvényes
-
Érvénytelen IMEI Szám:
- Szám: 490154203237518
- Luhn Ellenőrzés: Érvénytelen
Teszt Esetek
A Luhn algoritmus megvalósításának ellenőrzésére használhatja a következő teszt eseteket:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Tesztelt generált számok
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Minden teszt sikerült!")
test_luhn_algorithm()
Hivatkozások
- Luhn, H. P. (1960). "Számítógép a számok ellenőrzésére". US Patent 2,950,048.
- Gallian, Joseph. "Az azonosító számok matematikája." A Főiskolai Matematikai Folyóirat, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". Nemzetközi Szabványügyi Szervezet. Hozzáférés: 2024. augusztus 2.
- Knuth, Donald. "A számítógép programozás művészete, 2. kötet: Félszámszerű algoritmusok". Addison-Wesley, 1997.