Thuật_toán Luhn_Thuật toán Luhn hoặc công_thức Luhn cũng được biết là thuật_toán modulus 10 hay mod 10 nó được đặt theo tên người sáng_tạo ra nó nhà_khoa_học của IBM Hans_Peter_Luhn là một công_thức tổng kiểm đơn_giản được sử_dụng để xác_thực nhiều loại số nhận_dạng chẳng_hạn như số thẻ_tín_dụng IMEI National_Provider_Identifier tại Mỹ mã Social_Insurance_Numbers tại Canada Số ID tại Israel Nam_Phi Số an_sinh xã_hội Hy_Lạp ΑΜΚΑ và các mã khảo_sát xuất_hiện trên biên_lai của Taco_Bell và Tractor_Supply_Co_Nó được mô_tả trong bằng_sáng_chế tại Mỹ số 2 950 048 nộp vào ngày 6 tháng 1 năm 1954 và được cấp vào ngày 23 tháng 8 năm 1960 Thuật_toán này thuộc phạm_vi công_cộng và được sử_dụng rộng_rãi ngày_nay Nó được quy_định trong ISO IEC 7812 1 Nó không có ý_định là một hàm băm bảo_mật bằng mật_mã nó được thiết_kế để bảo_vệ chống lại các lỗi vô_ý không phải các cuộc tấn_công độc_hại Hầu_hết các thẻ_tín_dụng và nhiều số nhận_dạng chính_phủ sử_dụng thuật_toán như một phương_pháp đơn_giản để phân_biệt các số hợp_lệ với các số bị nhầm hoặc không chính_xác Mô_tả Thuật_toán dùng để tính_toán số này như sau Bước 1 Nhân đôi giá_trị của những số ở vị_trí chẵn tính từ phải sang bao_gồm cả số Check_Digit là các số ở vị_trí 2 4 6 14 trong đó số thứ 1 là số ngoài cùng phía bên phải của chuỗi số IMEI Check_Digit_Bước 2 Cộng dồn tất_cả các chữ_số riêng_lẻ của các số thu được ở bước 1 cùng với các số ở vị_trí lẻ là các số ở vị_trí 1 3 5 13 trong chuỗi số IMEI Bước 3 Nếu kết_quả ở bước 2 là một_số chia_hết_cho 10 thì số A sẽ bằng 0 Nếu kết_quả ở bước 2 không chia_hết_cho 10 thì A sẽ bằng số_chia hết cho 10 lớn hơn gần nhất trừ đi chính kết_quả đó Ví_dụ số IMEI là 350880 10 195032 A trong đó A là số kiểm_tra cần phải tính_toán Bước 1 10 16 0 0 18 0 4 Bước 2 1 0 1 6 0 0 1 8 0 4 3 0 8 1 1 5 3 42 Bước 3 A 50 42 8 Như_vậy số IMEI hợp_lệ phải là 350880 10 195032 8 Hơi khó hiểu Điểm mạnh và điểm yếu Thuật_toán Luhn sẽ phát_hiện bất_kỳ lỗi một chữ_số nào cũng như gần như tất_cả các chuyển_vị của các chữ_số liền kề Tuy_nhiên nó sẽ không phát_hiện chuyển_vị của dãy hai chữ_số 09 thành 90 hoặc ngược_lại Nó sẽ phát_hiện 7 trong số 10 lỗi số kép có_thể xảy ra nó sẽ không phát_hiện ra 22 55 33 66 hay 44 77 Các thuật_toán kiểm_tra số_phức tạp khác giống như thuật_toán Verhoeff và thuật_toán Damm có_thể phát_hiện thêm các lỗi sao_chép Thuật_toán Luhn mod N là một phần mở_rộng hỗ_trợ các chuỗi không có số Bởi_vì thuật_toán hoạt_động trên các chữ_số theo cách từ phải sang trái và các chữ_số 0 chỉ ảnh_hưởng đến kết_quả nếu chúng gây ra dịch_chuyển vị_trí việc đệm số 0 bắt_đầu một chuỗi số_không ảnh_hưởng đến phép_tính Do_đó các hệ_thống đệm đến một_số chữ_số cụ_thể ví_dụ bằng cách chuyển_đổi 1234 thành 0001234 có_thể thực_hiện xác_thực Luhn trước hoặc sau khi đệm và đạt được kết_quả tương_tự Chuẩn_bị một_số có độ dài từ 0 đến vị_trí lẻ khiến nó xử_lý số_từ trái sang phải thay_vì phải sang trái nhân đôi các chữ_số ở vị_trí lẻ Thuật_toán xuất_hiện trong United_States_Patent cho một thiết_bị cơ_khí cầm tay để tính_toán checksum Do_đó nó được yêu_cầu khá đơn_giản Thiết_bị lấy mod 10 tổng bằng phương_tiện cơ_học Các chữ_số thay_thế nghĩa_là kết_quả của thủ_tục nhân đôi và giảm không được tạo ra một_cách cơ_học Thay vào đó các chữ_số được đánh_dấu theo thứ_tự hoán_vị trên thân máy Triển_khai giả mã function checkLuhn string purportedCC Nơi sử_dụng Ngoài số thẻ_tín_dụng thuật_toán này cũng được sử_dụng để tính_toán số kiểm_tra trên số thẻ SIM Ví_dụ Lấy số sê ri SIM còn được gọi là ICCID 89610195012344000018 Số được in trên thẻ SIM thường là một tập_hợp_con của chuỗi này Hai chữ_số cuối_cùng là chữ_số kiểm_tra checkLuhn 896101950123440000 sẽ trả về 1 số kiểm đầu_tiên checkLuhn 950123440000 sẽ trả về 8 số kiểm thứ hai Số rút ngắn này theo sau là số kiểm của nó được in trên chính thẻ SIM Xem thêm BULLET Checksum_BULLET_Thuật toán Luhn mod N Liên_kết ngoài BULLET Implementation in 88 languages on the Rosetta_Code project
Thuật_toán Luhn