Algoritma Luhn

Algoritma Luhn atau formula Luhn, turut dipanggil "modulus 10" atau algoritma "mod 10", ialah formula hasil tambah semak ringkas yang digunakan untuk mengesahkan pelbagai nombor pengenalan, seperti nombor kad kredit dan nombor IMEI. Ia dicipta oleh Hans Perter Luhn, seorang saintis IBM, dan diperihalkan di dalam U.S. Patent No. 2,950,048, difailkan pada 6 Januari 1954, serta diluluskan pada 23 Ogos 1960.

Algoritma ini diletakkan di domain awam dan telah digunakan secara meluas malah dinyatakan di dalam ISO/IEC 7812-1. Ia bukan direka sebagai sebuah fungsi cincangan yang selamat dari segi kriptografi bagi menentang serangan jahat, tetapi sebagai perlindungan menentang ralat tak sengaja. Kebanyakan kad kredit dan nombor pengenalan kerajaan menggunakan algoritma ini sebagai kaedah ringkas bagi membezakan antara nombor sah dengan sekumpulan digit rawak.

Algoritma
Algoritma bagi mengesahkan digit periksa ialah
 Kira dari digit periksa, yang dihujung sebelah kanan, dan sambil bergerak ke kiri, darabkan setiap digit kedua dengan dua.
 Tambahkan setiap digit dalam hasil darab tadi (contohnya 10: 1+0 = 2, 14: 1+4 = 5, dsb.) besama-sama digit-digit yang tidak digandakan.
 Jika dan hanya jika baki hasil tambah tadi bahagi 10 ialah 0, maka nombor adalah sah menepati formula Luhn.

Pelaksaan dalam pengaturcaraan
Berikut ialah pelaksanaan Algoritma Luhn dalam python

Pengesahan digit periksa
def luhn_checksum(s):
    odd = [int(a) for a in s[-1::-2]]
    even = [int(a) for a in s[-2::-2]]
    tOdd = sum(odd)
    tEven = sum(sum(int(b) for b in str(a*2)) for a in even)
    checksum = tOdd+tEven
    return (checksum*9)%10

def luhn_sah(s):
    return luhn_checksum(s) == 0

Pengiraan digit periksa
def kira_luhn(s):
    return (10 - luhn_checksum(s))%10 # pastikan pulangan kurang daripada 10

Rujukan

Pautan luar
 LUHN-10 Error Detection Tool – Alat untuk memeriksa Luhn secara atas talian.

Aritmetik modular
Algoritma hasil tambah semak
Pengesanan dan pembetulan ralat