卢恩算法卢恩算法(英語:Luhn algorithm),也称为“模10”(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码、国际移动设备识别码,美国国家提供商标识号码,或是加拿大社会保险号码。该算法由IBM科学家漢斯·彼得·盧恩创造,专利于1954年1月6日申请,1960年8月23日颁证,美国专利号2950048[1]。 该算法现已属于公有领域并得到了广泛的应用,例如ISO/IEC 7812-1[2]。它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意攻击。 描述卢恩算法会通过校验码对一串数字进行验证,校验码通常会被加到这串数字的末尾处,从而得到一个完整的身份识别码。 我们以数字“7992739871”为例,计算其校验位,设校验位为X并添加至数列末位,即7992739871X:
另一种方法是:
优缺点卢恩算法可以发现某一位的错误。 卢恩算法几乎可以发现所有由于邻位上数字被交换产生的错误。 但是,它只能发现数字交换产生的错误中的7/10,不会发现22 ↔ 55, 33 ↔ 66 或 44 ↔ 77。 代码实现Java/**
* 校验位字符集
*/
private static char[] CHECKS = "0987654321".toCharArray();
public static boolean isValidLuhn(String number) {
if (number == null) {
return false;
}
char[] chs = number.toCharArray();
int count = 0;
for (int i = chs.length - 2, k = 1; i >= 0; i--, k++) {
// 不是数字字符时直接返回 false
if (chs[i] < '0' || chs[i] > '9') {
return false;
}
// 偶位数字 * 2,奇位不乘
int num = (chs[i] - '0') << (k & 1);
// 累加
count += num % 10 + num / 10;
}
// 对校验位进行比对
return (chs[chs.length - 1] == CHECKS[count % 10]);
}
参见参考文献 |
Index:
pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve
Portal di Ensiklopedia Dunia