Kikokotoo cha Algorithimu ya Luhn
Kihesabu cha Luhn
Utangulizi
Kihesabu cha Luhn, pia kinachojulikana kama "modulus 10" au "mod 10" kihesabu, ni fomula rahisi ya checksum inayotumiwa kuthibitisha nambari mbalimbali za utambulisho, kama vile nambari za kadi za mkopo, Nambari za Usajili wa Kijamii za Kanada, nambari za IMEI, na nambari za Kitambulisho cha Mtoa Huduma wa Kitaifa nchini Marekani. Kihesabu hiki kinakuruhusu kuthibitisha nambari kwa kutumia kihesabu cha Luhn na kuunda nambari halali zinazopita kipimo cha Luhn.
Jinsi Kihesabu cha Luhn Kinavyofanya Kazi
Kihesabu cha Luhn kinafanya kazi kama ifuatavyo:
- Kuanzia na kidijito cha kulia (bila kuhesabu kidijito cha kuangalia) na kusonga kushoto, ongeza thamani ya kila kidijito cha pili.
- Ikiwa matokeo ya operesheni hii ya kuongeza ni makubwa kuliko 9, punguzia 9 matokeo hayo.
- Jumlisha kidijito zote katika mfuatano unaotokana.
- Ikiwa jumla modulo 10 ni sawa na 0 (ikiwa jumla inaishia na sifuri), basi nambari hiyo ni halali kulingana na fomula ya Luhn; vinginevyo, si halali.
Hapa kuna uwakilishi wa picha wa kihesabu cha Luhn:
Fomula
Kihesabu cha Luhn kinaweza kuonyeshwa kimaandishi kama ifuatavyo:
Kuwe na kuwa kidijito cha -th, ukihesabu kutoka kidijito cha kulia (bila kuhesabu kidijito cha kuangalia) na kusonga kushoto. Kisha kidijito cha kuangalia kinachaguliwa ili:
Ambapo ni operesheni ya modulo.
Matumizi
Kihesabu cha Luhn kina matumizi mbalimbali katika nyanja tofauti:
- Uthibitishaji wa Kadi za Mkopo: Nambari nyingi za kadi za mkopo zinathibitishwa kwa kutumia kihesabu cha Luhn.
- Nambari za Usajili wa Kijamii za Kanada: Kihesabu cha Luhn kinatumika kuthibitisha uhalali wa nambari hizi za utambulisho.
- Nambari za IMEI: Nambari za simu za mkononi za IMEI zinajumuisha kidijito cha kuangalia kinachothibitishwa na kihesabu cha Luhn.
- Nambari za Kitambulisho cha Mtoa Huduma (NPI): Zinatumika katika mfumo wa huduma za afya nchini Marekani, nambari hizi zinathibitishwa kwa kutumia kihesabu cha Luhn.
- ISBNs: Baadhi ya nambari za ISBN-10 zinatumia toleo la kihesabu cha Luhn kwa uthibitishaji.
Mbadala
Ingawa kihesabu cha Luhn kinatumika sana, kuna algorithimu nyingine za checksum kwa madhumuni tofauti:
- Algorithimu ya Damm: Algorithimu nyingine ya kidijito cha kuangalia inayogundua makosa yote ya kidijito kimoja na makosa yote ya kubadilishana jirani.
- Algorithimu ya Verhoeff: Algorithimu ya checksum yenye ugumu zaidi inayogundua makosa yote ya kidijito kimoja na makosa mengi ya kubadilishana.
- Kidijito cha kuangalia cha ISBN-13: Kinatumia algorithimu tofauti na ISBN-10, ambayo inategemea kihesabu cha Luhn.
Historia
Kihesabu cha Luhn kilitengenezwa na Hans Peter Luhn, mwanasayansi wa kompyuta wa IBM, mwaka 1954. Luhn alikuwa miongoni mwa waanzilishi katika uwanja wa sayansi ya habari na anajulikana kwa uvumbuzi kadhaa, ikiwa ni pamoja na mfumo wa uorodheshaji wa KWIC (Key Word In Context).
Kihesabu hiki kilitengenezwa awali kulinda dhidi ya makosa ya bahati mbaya, si mashambulizi ya uhalifu. Ni muhimu kutambua kwamba ingawa kihesabu cha Luhn kinaweza kugundua makosa mengi ya kawaida, si njia salama ya usimbuaji na haipaswi kutegemewa kwa madhumuni ya usalama wa data.
Licha ya umri wake, kihesabu cha Luhn kinabaki kutumika sana kutokana na urahisi wake na ufanisi katika kugundua makosa ya kawaida ya kuandika.
Mifano ya Utekelezaji
Hapa kuna mifano ya msimbo ya kutekeleza kihesabu cha Luhn katika lugha mbalimbali za programu:
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])))
## Mfano wa matumizi:
print(luhn_validate(4532015112830366)) # Kweli
print(luhn_validate(4532015112830367)) # Si kweli
print(generate_valid_number(16)) # Inazalisha nambari halali ya tarakimu 16
Mambo ya Kuangalia na Maelezo Maalum
Wakati wa kutekeleza kihesabu cha Luhn, zingatia mambo yafuatayo na maelezo maalum:
-
Uthibitishaji wa Ingizo: Hakikisha kuwa ingizo ni mfuatano halali wa nambari. Wahusika wasio na tarakimu wanapaswa kushughulikiwa ipasavyo (ama kuondolewa au kut treated kama ingizo lisilo halali).
-
Sifuri za Kwanza: Kihesabu kinapaswa kufanya kazi vizuri na nambari ambazo zina sifuri za kwanza.
-
Nambari Kubwa: Jiandae kushughulikia nambari ndefu sana ambazo zinaweza kuzidi uwezo wa aina za kawaida za nambari katika lugha zingine za programu.
-
Ingizo Tupu: Eleza jinsi utekelezaji wako unapaswa kushughulikia mfuatano tupu au ingizo la null.
-
Seti za Wahusika zisizo za Kawaida: Katika programu zingine, unaweza kukutana na nambari zinazowakilishwa kwa wahusika nje ya mfuatano wa kawaida wa 0-9. Eleza jinsi hizi zinapaswa kushughulikiwa.
-
Mambo ya Utendaji: Kwa programu ambazo zinahitaji kuthibitisha nambari nyingi za ingizo haraka, fikiria kuboresha utekelezaji wa algorithimu.
Mifano ya Kihesabu
-
Nambari Halali ya Kadi ya Mkopo:
- Nambari: 4532015112830366
- Kihesabu cha Luhn: Halali
-
Nambari Isiyo Halali ya Kadi ya Mkopo:
- Nambari: 4532015112830367
- Kihesabu cha Luhn: Si Halali
-
Nambari Halali ya Usajili wa Kijamii wa Kanada:
- Nambari: 046 454 286
- Kihesabu cha Luhn: Halali
-
Nambari Isiyo Halali ya IMEI:
- Nambari: 490154203237518
- Kihesabu cha Luhn: Si Halali
Mifano ya Mtihani
Ili kuthibitisha utekelezaji wa kihesabu cha Luhn, unaweza kutumia mifano ifuatayo ya mtihani:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Jaribu nambari zilizozalishwa
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Mitihani yote imefanikiwa!")
test_luhn_algorithm()
Marejeo
- Luhn, H. P. (1960). "Kompyuta za Kuangalia Nambari". Patenti ya Marekani 2,950,048.
- Gallian, Joseph. "Hisabati ya Nambari za Utambulisho." Jarida la Hisabati ya Chuo, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". Shirika la Kimataifa la Viwango. Imetolewa Agosti 2, 2024.
- Knuth, Donald. "Sanaa ya Programu ya Kompyuta, Kiwango cha 2: Algorithimu za Semina." Addison-Wesley, 1997.