Validasi dan menghasilkan angka menggunakan algoritma Luhn, yang umum digunakan untuk nomor kartu kredit, Nomor Asuransi Sosial Kanada, dan nomor identifikasi lainnya. Uji apakah suatu angka lulus pemeriksaan Luhn atau menghasilkan angka valid yang mematuhi algoritma.
Algoritma Luhn, juga dikenal sebagai algoritma "modulus 10" atau "mod 10", adalah rumus checksum sederhana yang digunakan untuk memvalidasi berbagai nomor identifikasi, seperti nomor kartu kredit, Nomor Asuransi Sosial Kanada, nomor IMEI, dan nomor Pemberi Layanan Nasional di Amerika Serikat. Kalkulator ini memungkinkan Anda untuk memvalidasi nomor menggunakan algoritma Luhn dan menghasilkan nomor valid yang lulus pemeriksaan Luhn.
Algoritma Luhn bekerja sebagai berikut:
Berikut adalah representasi visual dari algoritma Luhn:
Algoritma Luhn dapat diekspresikan secara matematis sebagai berikut:
Biarkan menjadi digit ke-, menghitung dari digit paling kanan (tidak termasuk digit cek) dan bergerak ke kiri. Maka digit cek dipilih sehingga:
Di mana adalah operasi modulo.
Algoritma Luhn memiliki berbagai aplikasi di berbagai bidang:
Meskipun algoritma Luhn banyak digunakan, ada algoritma checksum lain untuk tujuan yang berbeda:
Algoritma Luhn diciptakan oleh Hans Peter Luhn, seorang ilmuwan komputer IBM, pada tahun 1954. Luhn adalah pelopor di bidang ilmu informasi dan diakui dengan beberapa inovasi, termasuk sistem pengindeksan KWIC (Key Word In Context).
Algoritma ini awalnya dirancang untuk melindungi terhadap kesalahan yang tidak disengaja, bukan serangan jahat. Penting untuk dicatat bahwa meskipun algoritma Luhn dapat mendeteksi banyak kesalahan umum, itu bukan bentuk enkripsi yang aman dan tidak boleh diandalkan untuk tujuan keamanan data.
Meskipun usianya, algoritma Luhn tetap banyak digunakan karena kesederhanaannya dan efektivitasnya dalam menangkap kesalahan transkripsi yang umum.
Berikut adalah beberapa contoh kode untuk mengimplementasikan algoritma Luhn dalam berbagai bahasa pemrograman:
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 nomor valid 16-digit
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 nomor valid 16-digit
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 nomor valid 16-digit
47 }
48}
49
Saat mengimplementasikan algoritma Luhn, pertimbangkan kasus tepi dan pertimbangan khusus berikut:
Validasi Input: Pastikan bahwa input adalah string angka yang valid. Karakter non-digit harus ditangani dengan tepat (baik dihapus atau dianggap sebagai input tidak valid).
Nol Awal: Algoritma harus bekerja dengan benar dengan nomor yang memiliki nol di depan.
Angka Besar: Siapkan untuk menangani nomor yang sangat panjang yang mungkin melebihi kapasitas tipe integer standar di beberapa bahasa pemrograman.
Input Kosong: Tentukan bagaimana implementasi Anda harus menangani string kosong atau input null.
Set Karakter Non-Standar: Dalam beberapa aplikasi, Anda mungkin menemui nomor yang diwakili dengan karakter di luar rentang standar 0-9. Tentukan bagaimana ini harus ditangani.
Pertimbangan Kinerja: Untuk aplikasi yang perlu memvalidasi sejumlah besar input dengan cepat, pertimbangkan untuk mengoptimalkan implementasi algoritma.
Nomor Kartu Kredit Valid:
Nomor Kartu Kredit Tidak Valid:
Nomor Asuransi Sosial Kanada Valid:
Nomor IMEI Tidak Valid:
Untuk memverifikasi implementasi algoritma Luhn, Anda dapat menggunakan kasus uji 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 nomor yang dihasilkan
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Semua tes berhasil!")
12
13test_luhn_algorithm()
14