Sahkan dan hasilkan nombor menggunakan algoritma Luhn, yang biasa digunakan untuk nombor kad kredit, Nombor Insurans Sosial Kanada, dan nombor pengenalan lain. Uji jika nombor tersebut lulus pemeriksaan Luhn atau hasilkan nombor yang sah yang mematuhi algoritma.
Algoritma Luhn, juga dikenali sebagai "modulus 10" atau "mod 10" algoritma, adalah formula checksum yang mudah digunakan untuk mengesahkan pelbagai nombor pengenalan, seperti nombor kad kredit, Nombor Insurans Sosial Kanada, nombor IMEI, dan nombor Pengenal Penyedia Nasional di Amerika Syarikat. Kalkulator ini membolehkan anda mengesahkan nombor menggunakan algoritma Luhn dan menghasilkan nombor yang sah yang lulus pemeriksaan Luhn.
Algoritma Luhn berfungsi seperti berikut:
Berikut adalah representasi visual algoritma Luhn:
Algoritma Luhn boleh dinyatakan secara matematik seperti berikut:
Biarkan menjadi digit ke-, mengira dari digit paling kanan (tidak termasuk digit semakan) dan bergerak ke kiri. Maka digit semakan dipilih supaya:
Di mana adalah operasi modulo.
Algoritma Luhn mempunyai pelbagai aplikasi dalam pelbagai bidang:
Walaupun algoritma Luhn digunakan secara meluas, terdapat algoritma checksum lain untuk tujuan yang berbeza:
Algoritma Luhn dicipta oleh Hans Peter Luhn, seorang saintis komputer IBM, pada tahun 1954. Luhn adalah pelopor dalam bidang sains maklumat dan diakui dengan beberapa inovasi, termasuk sistem pengindeksan KWIC (Kata Kunci Dalam Konteks).
Algoritma ini pada asalnya direka untuk melindungi daripada ralat tidak sengaja, bukan serangan berniat jahat. Penting untuk diperhatikan bahawa walaupun algoritma Luhn dapat mengesan banyak ralat biasa, ia bukan bentuk penyulitan yang selamat dan tidak boleh bergantung kepada untuk tujuan keselamatan data.
Walaupun usianya, algoritma Luhn tetap digunakan secara meluas kerana kesederhanaan dan keberkesanannya dalam menangkap ralat transkripsi yang biasa.
Berikut adalah beberapa contoh kod untuk melaksanakan algoritma Luhn dalam pelbagai bahasa pengaturcaraan:
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## Contoh penggunaan:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Menghasilkan nombor 16-digit yang sah
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// Contoh penggunaan:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Menghasilkan nombor 16-digit yang sah
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)); // Menghasilkan nombor 16-digit yang sah
47 }
48}
49
Apabila melaksanakan algoritma Luhn, pertimbangkan kes khas dan pertimbangan berikut:
Pengesahan Input: Pastikan bahawa input adalah rentetan nombor yang sah. Watak bukan digit harus ditangani dengan sewajarnya (sama ada dibuang atau dianggap sebagai input tidak sah).
Sifar Mula: Algoritma harus berfungsi dengan betul dengan nombor yang mempunyai sifar mula.
Nombor Besar: Bersedia untuk menangani nombor yang sangat panjang yang mungkin melebihi kapasiti jenis integer standard dalam beberapa bahasa pengaturcaraan.
Input Kosong: Tentukan bagaimana pelaksanaan anda harus menangani rentetan kosong atau input null.
Set Karakter Tidak Standard: Dalam beberapa aplikasi, anda mungkin menemui nombor yang diwakili dengan watak di luar julat standard 0-9. Tentukan bagaimana ini harus ditangani.
Pertimbangan Prestasi: Untuk aplikasi yang perlu mengesahkan sejumlah besar input dengan cepat, pertimbangkan untuk mengoptimumkan pelaksanaan algoritma.
Nombor Kad Kredit Sah:
Nombor Kad Kredit Tidak Sah:
Nombor Insurans Sosial Kanada Sah:
Nombor IMEI Tidak Sah:
Untuk mengesahkan pelaksanaan algoritma Luhn, anda boleh menggunakan kes ujian berikut:
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 # Uji nombor yang dihasilkan
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Semua ujian lulus!")
12
13test_luhn_algorithm()
14