身份证号码验证算法深入研究和Java实现_java

做项目的时候需要对拿到的数据进行“清洗”,比如剔除一些不可能存在的身份证号码。查阅了网上的身份证号码验证算法,自己也总结一下。

(一)18身份证号码的结构

  公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。

  排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。

1、地址码

  表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。

2、出生日期码

  表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

3、顺序码

  表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

4、校验码计算步骤

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

  S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
  Ai:表示第i位置上的身份证号码数字值(0~9)
  Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)

(2)计算模

  Y = mod(S, 11)

(3)根据模,查找得到对应的校验码

  Y: 0 1 2 3 4 5 6 7 8 9 10
  校验码: 1 0 X 9 8 7 6 5 4 3 2

(二)根据17位数字本体码获取最后一位校验码程序实例

public class Id18 {
  int[] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};  //十七位数字本体码权重
  char[] validate={ '1','0','X','9','8','7','6','5','4','3','2'};  //mod11,对应校验码字符值  

  public char getValidateCode(String id17){
    int sum=0;
    int mode=0;
    for(int i=0;i<id17.length();i++){
      sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i];
    }
    mode=sum%11;
    return validate[mode];
  }

  public static void main(String[] args){
    Id18 test=new Id18();
    System.out.println("该身份证验证码:"+test.getValidateCode("14230219700101101"));  //该身份证校验码:3
  }
}

(三)说明

1.程序可以根据已有的17位数字本体码,获取对应的验证码。

2.该程序可以剔除验证码不正确的身份证号码。

3.15位的身份证出生年份采用年份后2位,没有最后1位校验码。

4.完整的身份证18位,最后一位校验位可能是非数字。我们的一个项目,数据库保存前17位数字,这样对应一些SQL语句(比如inner join)有加速作用的!!!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 身份证号码
验证算法
身份证号码验证算法、身份证号码算法、身份证号码校验算法、常用算法深入学习实录、深入浅出遗传算法,以便于您获取更多的相关知识。

时间: 2025-01-12 14:36:48

身份证号码验证算法深入研究和Java实现_java的相关文章

破解火车票上的身份证号码

首先我在百度上找到了一个他人的火车票图片 接着从图片里我们可以获取到信息如下: 姓名 梅勇性别 男 (倒数第四位至倒数第二位3位数为顺序码,顺序码为奇数所以为男性)(可参考http://www.cnblogs.com/xudong-bupt/p/3293838.html)来自 武汉市新洲区 (身份证号码前六位代表地区)(可参考http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/200406/t20040607_38302.html) 身份证号码:4201171988

PHP的身份证号码工具类翻译的那个Java的

<?php /** * 身份证工具类 * * @author Tongle Xu <xutongle@gmail.com> 2013-6-6 * @copyright Copyright (c) 2003-2103 tintsoft.com * @license http://www.php100.com * @version $Id$ */ class Utils_Idcard { /** * 中国公民身份证号码最小长度. */ const CHINA_ID_MIN_LENGTH =

java身份证号码验证类

 代码如下 复制代码 package my.tools; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; /**  * 身份证工

身份证号码转换-JAVA

问题描述 publicStringupTo18(StringidCard)throwsException{idCard=IdCard15to18(idCard);Strings=idCard.replaceAll("\d","").trim();if(s!=null&&!"".equals(s)){charc=s.charAt(0);if(c>='a'&&c<='z'){c=(char)(c-('a'-

php中如何验证身份证号码

身份证号码的结构 身份证号码是特征组合码,由17位数字本体码和一位校验码组成. 排列顺序从左至右依此为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码(前六位数) 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 出生日期码(第七位至十四位) 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月.日代码之间不用分隔符. 顺序码(第十五位至十七位) 表示在同一地址码所标识的区域范围,对同年.同月.同日出生的人编定的顺

MaxCompute UDF系列之身份证校验及15位身份证号码转换成18位

为了验证一些老证件上的身份证号码到底是不是本人,今天为大家提供一个15位身份证号码转换成18位的MaxCompute的UDF,下载地址见附件. 效果如下: MaxCompute UDF代码如下: /*** * 身份证号码构成:6位地址编码+8位生日+3位顺序码+1位校验码 * 验证15位,18位证件号码是否有效:15位号码将直接转为18位: * 校验身份证号码除了校验位是否为数值,校验省份.出生日期 * 校验位不正确的会被正确的替代 * 出生日期逻辑有效性,即是否1900年前出生,是否当前日期后

哪位大神做过全国身份证号码查询接口?进来看下

问题描述 我们平台要对接公安部的身份证号码查询接口,他们就给了一份接口文档以及一份密钥,我们是用asp.net开发的,我已经添加好了webservice,调用他们的方法,但是提示验证信息出错,有没有哪位大神做过?跟我说下流程,是不是哪个参数需要xml?最好有做好的接口列子给我参考下,感激不尽! 解决方案 解决方案二:没混到可以调用公安接口的程度--解决方案三:有没人做过啊?解决方案四:有人没啊!!!解决方案五:那你把接口放出来呗,让我们瞧瞧解决方案六:引用4楼wyd1520的回复: 那你把接口放

jsp身份证号码验证代码(15,18位)

<%@ page contenttype="text/html; charset=gb2312" language="java" import="java.sql.*" errorpage="" %> <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml

PHP实现中国公民身份证号码有效性验证示例代码

本文将使用Java实现中国公民(15位或者18位)身份证号码的相关验证,功能如下: 身份证号有效性验证 分析详细身份证信息 生成一个虚拟的省份证号码. 身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码(前六位数) 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码(第七位至十四位) 表示编码对象出