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]);
}
}
相关文章推荐
- Java实现身份证号码验证源码分享
- java实现—身份证号码验证
- 身份证号码验证算法深入研究和Java实现
- java实现身份证号码验证及修改
- Java实现身份证号码验证源码示例分享
- java代码实现身份证第18位的计算和验证身份证号码是否是真实有效.
- Java实现身份证号码的验证,JAVA后台验证身份证号码
- Java实现身份证号码验证
- java 实现从15位~18位的身份证号码转换,校验中国大陆公民身份证、香港居民身份证、澳门身份证和台湾身份证。
- Java 验证二代身份证号码是否正确
- C实现身份证号码验证
- java实现的18位身份证格式验证算法
- js实现二代身份证号码验证详解
- js实现身份证号码验证
- java算法之身份证号码验证
- Java身份证号码数据验证
- java验证身份证号码是否有效源代码
- java验证身份证号码是否有效源代码
- java正则实现身份证号码匹配
- java验证身份证号码