Algoritma Luhn

Daripada Wikipedia, ensiklopedia bebas.
Lompat ke: pandu arah, cari

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.[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[sunting | sunting sumber]

Algoritma bagi mengesahkan digit periksa ialah

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

Pelaksaan dalam pengaturcaraan[sunting | sunting sumber]

Berikut ialah pelaksanaan Algoritma Luhn dalam python

Pengesahan digit periksa[sunting | sunting sumber]

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[sunting | sunting sumber]

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

Rujukan[sunting | sunting sumber]

Pautan luar[sunting | sunting sumber]