[转]java实现—身份证号码验证
原文地址:http://akunamotata.iteye.com/blog/333228身份证号码的编码原理:
号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码 ,八位数字出生日期码 ,三位数字顺序码 和一位数字校验码 。
校验码的计算
(1)十七位数字本体码 加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前 17 位数字的权求和
Ai: 表示第 i 位置上的身份证号码数字值
Wi: 表示第 i 位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
S: =(4*7+5*9+2*10+1*5+2*8+4*4+1*2+9*1+8*6+3*3+0*7+7*9+0*10+3*5+0*8+3*4+9*2) = 306;
(2)计算模
Y = mod(S, 11)
Y=306%11=9;
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码 : 1 0 X 9 8 7 6 5 4 3 2
java代码实现:
class VerifyIdCard { // wi =2(n-1)(mod 11);加权因子 final int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 }; // 校验码 final int[] vi = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 }; private int[] ai = new int; public VerifyIdCard() { } // 校验身份证的校验码 public boolean verify(String idcard) { if (idcard.length() == 15) { idcard = uptoeighteen(idcard); } if (idcard.length() != 18) { return false; } String verify = idcard.substring(17, 18); if (verify.equals(getVerify(idcard))) { return true; } return false; } // 15位转18位 public String uptoeighteen(String fifteen) { StringBuffer eighteen = new StringBuffer(fifteen); eighteen = eighteen.insert(6, "19"); return eighteen.toString(); } // 计算最后一位校验值 public String getVerify(String eighteen) { int remain = 0; if (eighteen.length() == 18) { eighteen = eighteen.substring(0, 17); } if (eighteen.length() == 17) { int sum = 0; for (int i = 0; i < 17; i++) { String k = eighteen.substring(i, i + 1); ai = Integer.valueOf(k); } for (int i = 0; i < 17; i++) { sum += wi * ai; } remain = sum % 11; } return remain == 2 ? "X" : String.valueOf(vi); }}
页:
[1]