您的位置:首页 > 编程语言 > Java开发

java实现—身份证号码验证

2014-03-07 15:18 656 查看

身份证号码的编码原理:

号码的结构

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码 ,八位数字出生日期码 ,三位数字顺序码 和一位数字校验码 。

校验码的计算

(1)十七位数字本体码加权求和公式

S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前
17 位数字的权求和

Ai: 表示第
i 位置上的身份证号码数字值

Wi: 表示第
i 位置上的加权因子

Wi: 7 9 10 5 8 42163
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 45678
9 10

校验码 : 10X98
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[18];

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(this.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[i] = Integer.valueOf(k);
}
for (int i = 0; i < 17; i++) {
sum += wi[i] * ai[i];
}
remain = sum % 11;
}
return remain == 2 ? "X" : String.valueOf(vi[remain]);

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: