`

身份证号码分析

阅读更多

身份证号码工具类

 

身份证号码规则

摘自百度:

[根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。]

身份证工具方法

中华人民共和国居民身份证由两种,一种是15位身份证号码,一种是18位身份证号码.

以下是总结了一些身份证常用方法.不是很完整.

 

package cn.com.jody.util;

/**
 * 功能/模块:工具类<br>
 * 类描述:身份证工具类
 * 
 * @author JODY  
 */
public class CardUtil {
	// 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模
	// 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4
	// 加权因子
	static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

	// 校验位数组
	static char[] ai = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };

	/**
	 * 根据15位身份证号和出生日期计算得出18位身份证号
	 * 
	 * @param id15,15位身份证号
	 * @param birthday出生日期,19820329
	 * @return id18,返回18位身份证号
	 */
	public static String id15To18Number(String id15, String birthday) {
		if (isNullEmpty(id15) || id15.length() != 15 || isNullEmpty(birthday) || birthday.length() != 8) {
			return null;
		} else {
			return id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6) + ai[checkBit(id15, birthday)];
		}
	}

	/**
	 * 判断字符串是否为null或者长度是否为0
	 * 
	 * @param text
	 *            字符串
	 * @return boolean
	 */
	public static boolean isNullEmpty(String text) {
		if (null == text) {
			return true;
		} else if (0 == text.length()) {
			return true;
		}
		return false;
	}

	/**
	 * 
	 * 根据15位身份证号和出生日期,计算校验位
	 * 
	 * @param id15,15位身份证号
	 * @param birthday出生日期,19820329
	 * @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]
	 */
	public static int checkBit(String id15, String birthday) {
		id15 = id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6);
		int sum = 0;
		// 计算校验位,前17位加权求和,然后除以11取模
		// S = Sum(Ai * Wi), i = 0, ... , 16 ,对前17位数字的权求和
		// Ai:表示第i位置上的身份证号码数字值
		// Wi:表示第i位置上的加权因子
		for (int i = 1; i < id15.length() + 1; i++) {
			sum = sum + wi[i - 1] * (Integer.parseInt(id15.substring(i - 1, i)));
		}
		int mod = sum % 11;
		return mod;
	}

	/**
	 * 根据传入的18位身份证号,计算校验位
	 * 
	 * @param id,18位身份证号
	 * @return mod,返回校验位,用于从ai数组取数作为身份证号的校验位,即ai[mod]
	 */
	public static int checkBit(String id) {
		String id17 = id.substring(0, 17);
		int sum = 0;
		for (int i = 0; i < id17.length(); i++) {
			int ai = Integer.parseInt(id17.substring(i, i + 1));
			sum += wi[i] * ai;
		}
		int mod = sum % 11;
		return mod;
	}

	/**
	 * 校验15位身份证号与出生日期
	 * 
	 * @param id,15位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @return result
	 */
	public static boolean checkId15BirthDay(String id, String birthday) {
		boolean result = false;
		String birth_id = id.substring(6, 12);// 6位日期
		String birth = birthday.substring(2);
		// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
		if (birth_id.equals(birth)) {
			result = true;
		} else {
			// 出生日期与身份证中的出生日期不相符
			result = false;
		}
		return result;
	}

	/**
	 * 校验15位身份证号与性别
	 * 
	 * @param id,15位身份证号
	 * @param sex,性别,
	 *            0-女 1-男
	 * @return result
	 */
	public static boolean checkId15Sex(String id, Integer sex) {
		boolean result = false;

		String temp = id.substring(14);// 最后一位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		if (isex % 2 == sex) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 校验18位身份证号
	 * 
	 * @param id,18位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @param sex,性别, 0-女,1-男
	 * @return result
	 */
	public static boolean checkId18BirthDay(String id, String birthday) {
		boolean result = false;
		String birth_id = id.substring(6, 14);// 8位日期
		// 检验日期,出生日期与身份证中的出生日期相符,然后检验性别
		if (birth_id.equals(birthday)) {
			result = true;
		} else {
			// 出生日期与身份证中的出生日期不相符
			result = false;
		}
		return result;
	}

	/**
	 * 校验18位身份证号
	 * 
	 * @param id,18位身份证号
	 * @param birthday,出生日期8位(19820329)
	 * @param sex,性别,0-女,1-男
	 * @return result
	 */
	public static boolean checkId18Sex(String id, Integer sex) {
		boolean result = false;
		String temp = id.substring(16, 17);// 倒数第二位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		if (isex % 2 == sex) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}

	/**
	 * 获取18位身份证号的出生日期
	 * 
	 * @param id
	 * @return
	 */
	public static String getId18Birthday(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return null;
		String birthday = id.substring(6, 14);// 8位日期;
		return birthday;
	}

	/**
	 * 获取18位身份证号的性别
	 * 
	 * @param id
	 * @return
	 */
	public static Integer getId18Sex(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return null;
		String temp = id.substring(16, 17);// 倒数第二位代表性别
		int isex = Integer.parseInt(temp);
		// 男为奇数,女为偶数
		// 性别 0-女 1-男
		if (isex % 2 == 0) {
			return 0;
		} else {
			return 1;
		}
	}

	/**
	 * 验证身份证号码是否正确
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18(String id) {
		if (validId18IsNumber(id) && validId18IsBirthday(id) && validId18IsBit(id))
			return true;
		else
			return false;
	}

	/**
	 * 验证身份证字符是否为合法
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsNumber(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证前17位是否为数字
		for (int i = 0; i < 17; i++) {
			if (id.charAt(i) < '0' || id.charAt(i) > '9')
				return false;
		}
		return true;
	}

	/**
	 * 验证身份证出生日期是否合法
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsBirthday(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证出生日期
		int y = Integer.parseInt(id.substring(6, 10));
		int m = Integer.parseInt(id.substring(10, 12));
		int d = Integer.parseInt(id.substring(12, 14));
		if (y < 1900 || m < 1 || m > 12 || d < 1 || d > 31 || ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) || (m == 2 && ((y % 4 > 0 && d > 28) || d > 29)))
			return false;
		return true;
	}

	/**
	 * 验证身份证验证数是否正确
	 * 
	 * @param id,18位身份证号码
	 * @return true 正常,false 错误
	 */
	public static boolean validId18IsBit(String id) {
		if (isNullEmpty(id) || id.length() != 18)
			return false;
		// 验证身份证验证位
		String bit = id.substring(17);
		String tbit = String.valueOf(ai[checkBit(id)]);
		if (!bit.equals(tbit))
			return false;
		return true;
	}

	public static void main(String[] args) {
		System.out.println(CardUtil.validId18("43102819841s312434"));
	}
}

 

 

分享到:
评论
1 楼 MyChina 2009-09-08  
不错啊,多谢分享!

相关推荐

    C#身份证号码分析_身份证验证程序

    从键盘上输入一个身份证号码:回车之后,判断是否为正确号码(位数、有无字符);如果正确,则判断他是旧号码(15位)还是新号码(18位),如果是旧号码,把它转化为新号码;如果是新号码,打印出该人的生日、年龄和...

    身份证号码数据详细列表

    通过对给定的身份证号码数据详细列表的分析,我们可以了解到身份证号码中的地址码是如何构成的,以及它在中国户籍管理和公民身份认证体系中的重要作用。了解这些信息,对于从事相关行业工作的人士,尤其是IT行业的...

    2012中国分省身份证号码前6位地区对照表.pdf

    在人口学研究、社会经济统计等领域,研究者常常需要根据身份证号码中的地区代码来分析不同区域的人口分布、流动性及社会经济情况。这些数据对于国家政策的制定、资源的合理配置等都具有指导意义。 从技术角度看,...

    判断身份证号码是否正确

    根据给定的信息,本文将详细解释身份证号码验证的原理及Delphi实现方法。身份证号码在中国通常为18位,包含了持证人的出生日期、性别、户籍所在地等信息,并且通过一个复杂的校验码来确保其唯一性和有效性。下面将...

    身份证号码相关的excel函数应用实例.zip

    这个压缩包文件“身份证号码相关的excel函数应用实例.zip”显然包含了关于如何利用Excel的内置函数来处理和分析身份证号码的实例。我们将深入探讨几个关键的Excel函数,它们在处理身份证号码时特别有用。 1. **LEFT...

    基于Qt和opencv的身份证号码识别系统

    - **文字分割**:使用字符分割技术,如连通成分分析,将身份证号码从背景中分离出来。 - **字符识别**:应用OCR(Optical Character Recognition)技术,将分割后的字符转换为文本。OpenCV本身不包含强大的OCR引擎,...

    C++中身份证号码验证代码

    通过分析和解释这段代码,我们可以了解到如何在C++中进行身份证号码的验证。 首先,我们需要了解身份证号码的基本结构。前6位代表行政区划代码,接着的8位是出生日期,接下来的3位是顺序码,其中奇数分配给男性,...

    java身份证系统

    【Java身份证系统】是一个基于Java技术开发的应用程序,它的主要功能是通过输入公民的身份证号码,获取并显示与该身份证关联的个人信息,如年龄、性别和省份等关键数据。这个系统利用了Java强大的数据处理能力和面向...

    JAVA程序实验报告册

    此外,调试分析部分反映了学生在编程过程中遇到的困难,如最初缺乏编程思路,通过模仿解决了界面设计问题,但在数据库连接和用户验证方面遇到了挑战。尽管如此,学生表示已经基本实现了大部分功能,但用户管理和一些...

    身份证号码对应地方区号表

    综上所述,通过分析身份证号码的结构及其组成部分,特别是前六位地区码,我们不仅能够准确地识别出一个人所在的省级行政区,还能进一步了解其具体的地级市和县区信息。这对于开发人员来说是一项非常实用的技术,有助...

    如何快速在身份证号码中提取出生日期.doc

    身份证号码中出生日期的提取是一个常见的数据处理问题,在实际工作中,我们经常需要从身份证号码中提取出生日期以便进行后续的数据分析和处理。下面我们将介绍两种常见的身份证号码中出生日期提取方法。 18 位...

    Excel2021:输入身份证号码的三种方法.docx

    Excel2021 输入身份证号码的三种方法 Excel 是一个功能强大的电子表格软件,在日常工作中广泛应用于数据存储和分析。但是,在输入身份证号码时,经常会出现问题,即输入的身份证号码被自动转换为科学计数法,导致...

    深度学习在身份证号码识别中的应用.pdf

    深度学习在身份证号码识别中的应用.pdf 深度学习在身份证号码识别中的应用.pdf论文的主要内容是提出了一种基于深度学习的身份证号码识别方法。该方法首先通过OSTU实现文字区域的提取,然后通过投影统计法切割单个...

    h5校验身份证号码

    #### 二、身份证号码结构分析 在进行验证之前,我们需要了解身份证号码的基本结构: 1. **地址码**(前六位):表示编码对象常住户口所在县(市、旗、区)的行政区划代码。 2. **出生日期码**(第七位到第十四位):...

    身份证号码区域查询数据库 (mysql 格式)

    "身份证号码区域查询数据库 (mysql 格式)"提供了一个方便的解决方案,尤其适用于需要进行身份证号码验证、区域定位或相关数据分析的应用场景。 MySQL是一种广泛使用的开源关系型数据库管理系统,它支持SQL语言,...

    一个基于公民身份号码规则获取身份证号码中包含的基础信息组件PHP

    总之,这个PHP组件为开发者提供了一种方便的方式来处理和分析中国公民的身份证号码,从中提取出生日期、性别等关键信息,简化了与身份证号码相关的编程任务。在使用时,应确保遵循最佳实践和相关法律法规,以保障...

    公民身份证号码检测。。

    通过上述分析可知,中国公民的身份证号码具有严格的结构和验证机制,确保每个号码的唯一性和准确性。了解这些基础知识有助于开发人员更好地处理和验证身份证号码数据,提高应用的安全性和用户体验。

    PHP读取身份证姓名和身份证号码API

    在处理用户数据时,特别是涉及个人敏感信息,如身份证姓名和身份证号码时,安全且有效的API至关重要。本文将深入探讨如何在PHP中创建一个读取身份证姓名和身份证号码的API。 首先,理解身份证姓名和身份证号码的...

    excel根据身份证号码。自动算出距离退休一个月内提醒标记.zip

    在Excel中,根据身份证号码计算退休年龄并设置自动提醒是一项实用的数据处理技能。这涉及到Excel的函数应用、条件格式化以及对身份证号码的理解。以下将详细介绍这个过程。 首先,身份证号码中的出生日期信息隐藏在...

Global site tag (gtag.js) - Google Analytics