Thuật toán Luhn là gì?
Thuật toán Luhn, còn được gọi là thuật toán "mod 10", là một công thức kiểm tra (checksum) đơn giản do nhà khoa học Hans Peter Luhn của IBM phát minh năm 1954. Nó được dùng để xác thực các dãy số định danh như số thẻ tín dụng và thẻ ghi nợ, số serial IMEI của điện thoại, cùng nhiều loại mã số định danh quốc gia. Thuật toán này phát hiện được lỗi sai một chữ số và hầu hết các lỗi đảo chỗ chữ số, nhưng nó không phải là biện pháp bảo mật mã hóa — chỉ là một bước kiểm tra tính toàn vẹn dữ liệu cơ bản.
Cách dùng công cụ này
Hãy nhập dãy số bạn muốn kiểm tra vào ô (khoảng trắng và dấu gạch ngang sẽ được tự động bỏ qua). Công cụ sẽ xử lý các chữ số, áp dụng phép kiểm tra Luhn và cho bạn biết dãy số đó HỢP LỆ hay KHÔNG HỢP LỆ, kèm theo tổng cộng dồn, kết quả tổng chia lấy dư cho 10, và chữ số kiểm tra ở cuối.
Giải thích công thức
Đọc các chữ số từ phải sang trái. Giữ nguyên chữ số ngoài cùng bên phải (chữ số kiểm tra), sau đó nhân đôi mỗi chữ số ở vị trí thứ hai. Nếu kết quả nhân đôi lớn hơn 9, hãy trừ đi 9 (tương đương với cộng hai chữ số của nó lại, ví dụ \(8\times2=16 \to 1+6=7\)). Cộng tất cả các giá trị thu được. Nếu tổng chia hết cho 10, dãy số vượt qua phép kiểm tra Luhn.
$$\text{Valid} \iff \left(\sum_{i=0}^{n-1} f(d_i)\right) \bmod 10 = 0 \\[1.5em] \text{where}\quad \left\{ \begin{aligned} d_i &= i\text{-th digit of } \text{Number} \text{ (from right)} \\ f(d_i) &= \begin{cases} d_i & i \text{ even} \\ 2d_i - 9\,[2d_i>9] & i \text{ odd} \end{cases} \end{aligned} \right.$$
Ví dụ minh họa
Lấy dãy số 79927398713. Nhân đôi mỗi chữ số ở vị trí thứ hai tính từ phải sang và rút gọn các giá trị lớn hơn 9, ta được các chữ số đã điều chỉnh có tổng là 70. Vì \(70 \bmod 10 = 0\), nên dãy số này hợp lệ.
Câu hỏi thường gặp
Kết quả Luhn hợp lệ có nghĩa là thẻ có thật không? Không. Nó chỉ xác nhận dãy số có cấu trúc đúng chuẩn; nó không kiểm tra xem tài khoản có tồn tại hay có tiền trong đó hay không.
Được phép nhập những ký tự nào? Chỉ các chữ số mới được sử dụng; khoảng trắng, dấu gạch ngang và các ký hiệu khác sẽ bị loại bỏ trước khi tính toán.
Tại sao phải trừ 9 khi nhân đôi? Trừ 9 khỏi một chữ số đã nhân đôi mà lớn hơn 9 sẽ cho kết quả giống hệt như khi cộng hai chữ số của nó lại, và đó chính xác là điều mà quy tắc Luhn gốc yêu cầu.