Thibitisha na tengeneza nambari kwa kutumia algorithimu ya Luhn, inayotumika mara nyingi kwa nambari za kadi za mkopo, Nambari za Kitambulisho cha Jamii za Kanada, na nambari nyingine za utambulisho. Jaribu ikiwa nambari inapitisha ukaguzi wa Luhn au tengeneza nambari halali zinazokidhi algorithimu.
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.
Kihesabu cha Luhn kinafanya kazi kama ifuatavyo:
Hapa kuna uwakilishi wa picha wa kihesabu cha Luhn:
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.
Kihesabu cha Luhn kina matumizi mbalimbali katika nyanja tofauti:
Ingawa kihesabu cha Luhn kinatumika sana, kuna algorithimu nyingine za checksum kwa madhumuni tofauti:
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.
Hapa kuna mifano ya msimbo ya kutekeleza kihesabu cha Luhn katika lugha mbalimbali za programu:
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## Mfano wa matumizi:
22print(luhn_validate(4532015112830366)) # Kweli
23print(luhn_validate(4532015112830367)) # Si kweli
24print(generate_valid_number(16)) # Inazalisha nambari halali ya tarakimu 16
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// Mfano wa matumizi:
29console.log(luhnValidate(4532015112830366)); // kweli
30console.log(luhnValidate(4532015112830367)); // si kweli
31console.log(generateValidNumber(16)); // Inazalisha nambari halali ya tarakimu 16
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)); // kweli
45 System.out.println(luhnValidate(4532015112830367L)); // si kweli
46 System.out.println(generateValidNumber(16)); // Inazalisha nambari halali ya tarakimu 16
47 }
48}
49
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.
Nambari Halali ya Kadi ya Mkopo:
Nambari Isiyo Halali ya Kadi ya Mkopo:
Nambari Halali ya Usajili wa Kijamii wa Kanada:
Nambari Isiyo Halali ya IMEI:
Ili kuthibitisha utekelezaji wa kihesabu cha Luhn, unaweza kutumia mifano ifuatayo ya mtihani:
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 # Jaribu nambari zilizozalishwa
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Mitihani yote imefanikiwa!")
12
13test_luhn_algorithm()
14