java实现—身份证号码验证
来源:互联网 发布:数组转txt php 编辑:程序博客网 时间:2024/04/28 03:13
身份证号码的编码原理:
号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码 ,八位数字出生日期码 ,三位数字顺序码 和一位数字校验码 。
校验码的计算
(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[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实现身份证号码验证及修改
- js实现身份证号码验证
- js实现身份证号码验证
- js实现身份证号码验证
- C实现身份证号码验证
- js实现身份证号码验证
- js实现身份证号码验证
- java代码验证身份证号码
- java验证身份证号码
- Java验证身份证号码
- Java身份证号码数据验证
- JAVA 身份证号码有效性验证
- Java 身份证号码验证程序
- java验证身份证号码
- SL复习笔记之平稳转型——基础篇(四、多媒体,工具提示和右键菜单)
- Win7下安装和卸载Oracle 10g数据库
- poi操作Excel学习
- SP debug info incorrect because of optimization or inline assembler
- 数字签名是什么?
- java实现—身份证号码验证
- C#连接Access数据库,各类程序连接不同类型数据库 [待补充]
- 基于 Android NDK 的学习之旅-----HelloWorld (附源码)
- Intent基础篇
- perl中grep用法总结
- ASP.net 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。解决方法
- hdu 2084 数塔(DP水)
- 海量数据处理之Bloom Filter详解
- hdu 1080 Human Gene Functions(类最长公共子序列)