首页 » 技术分享 » 判断身份证校验位是否正确

判断身份证校验位是否正确

 
文章目录

基础知识:

第一步:将身份证号码的第1位数字与7相乘;将身份证号码的第2位数字与9相乘;将身份证号码的第3位数字与10相乘;将身份证号码的第4位数字与5相乘;将身份证号码的第5位数字与8相乘;将身份证号码的第6位数字与4相乘;将身份证号码的第7位数字与2相乘;将身份证号码的第8位数字与1相乘;将身份证号码的第9位数字与6相乘;将身份证号码的第10位数字与3相乘;将身份证号码的第11位数字与7相乘;将身份证号码的第12位数字与9相乘;将身份证号码的第13位数字与10相乘;将身份证号码的第14位数字与5相乘;将身份证号码的第15位数字与8相乘;将身份证号码的第16位数字与4相乘;将身份证号码的第17位数字与2相乘。

第二步:将第一步身份证号码1~17位相乘的结果求和,全部加起来。

第三步:用第二步计算出来的结果除以11,这样就会出现余数为0,余数为1,余数为2,余数为3,余数为4,余数为5,余数为6,余数为7,余数为8,余数为9,余数为10共11种可能性。

第四步:如果余数为0,那对应的最后一位身份证的号码为1;如果余数为1,那对应的最后一位身份证的号码为0;如果余数为2,那对应的最后一位身份证的号码为X;如果余数为3,那对应的最后一位身份证的号码为9;如果余数为4,那对应的最后一位身份证的号码为8;如果余数为5,那对应的最后一位身份证的号码为7;如果余数为6,那对应的最后一位身份证的号码为6;如果余数为7,那对应的最后一位身份证的号码为5;如果余数为8,那对应的最后一位身份证的号码为4;如果余数为9,那对应的最后一位身份证的号码为3;如果余数为10,那对应的最后一位身份证的号码为2。

直接上代码:

1.工具类中的核心方法

/**
	 * 判断身份证校验位是否正确
	 * @param idCardNo
	 * @return
	 * @auther ServerZhang
	 * @date 2018年5月28日
	 */
	public static Result verifyCheckBit(String idCardNo){
		if (StringUtil.isEmpty(idCardNo)) {
			return new Result(false, "身份证号为空");
		}
		
		char[] charArray = idCardNo.toCharArray();
		int length = charArray.length;
		if (length != 18) {
			return new Result(false, "身份证号长度不正确");
		}
		
		//1.前17位分别乘指定数字并求和
		Integer sum = 0;
		for(int i=0; i<length-1; i++){
			IdCardMulEnum mulEnum = IdCardMulEnum.getByBitNum(i);
			if (mulEnum == null) {
				return new Result(false, "系统参数配置有误 ,请联系管理员处理");
			}
			Integer mulNum = mulEnum.getMulNum();
			int number = charArray[i] - '0';
			sum += mulNum * number;
		}
		
		//2.将和值模11
		int remainder = sum % 11;
		
		IdCardCheckBitEnum checkBitEnum = IdCardCheckBitEnum.getByRemainder(remainder);
		if (checkBitEnum == null) {
			return new Result(false, "系统参数配置有误 ,请联系管理员处理");
		}
		
		int lastNum = (int)charArray[17];
		if (lastNum == checkBitEnum.getCheckBit()) {
			return new Result(true, "正确的身份证号");
		}
		return new Result(false, "该身份证号校验位不正确");
	}

2.方法中涉及的返回结果Result类

/**
 * 返回结果
 * @author ServerZhang
 * @date 2018年5月28日
 */
public class Result {
 
	private Boolean success;
	private String infor;
	private Object data;
	
	public Result(Boolean success, String infor, Object data){
		if (success == null) {
			success = false;
		}
		this.success = success;
		this.infor = infor;
		this.data = data;
	}
	
	public Result(Boolean success, String infor){
		if (success == null) {
			success = false;
		}
		this.success = success;
		this.infor = infor;
		this.data = null;
	}

	public Boolean getSuccess() {
		return success;
	}

	public void setSuccess(Boolean success) {
		this.success = success;
	}

	public String getInfor() {
		return infor;
	}

	public void setInfor(String infor) {
		this.infor = infor;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}
	
	
}

3.方法中涉及的身份证乘数位枚举IdCardMulEnum:

/**
 * 身份证乘数位枚举
 * 说明:身份证号前17位分别的乘数
 * @author ServerZhang
 * @date 2018年5月28日
 */
public enum IdCardMulEnum {
	
	BIT_0(0,7,"身份证第1位乘以7"),
	BIT_1(1,9,"身份证第2位乘以9"),
	BIT_2(2,10,"身份证第3位乘以10"),
	BIT_3(3,5,"身份证第4位乘以5"),
	BIT_4(4,8,"身份证第5位乘以8"),
	BIT_5(5,4,"身份证第6位乘以4"),
	BIT_6(6,2,"身份证第7位乘以2"),
	BIT_7(7,1,"身份证第8位乘以1"),
	BIT_8(8,6,"身份证第9位乘以6"),
	BIT_9(9,3,"身份证第10位乘以3"),
	BIT_10(10,7,"身份证第11位乘以7"),
	BIT_11(11,9,"身份证第12位乘以9"),
	BIT_12(12,10,"身份证第13位乘以10"),
	BIT_13(13,5,"身份证第14位乘以5"),
	BIT_14(14,8,"身份证第15位乘以8"),
	BIT_15(15,4,"身份证第16位乘以4"),
	BIT_16(16,2,"身份证第18位乘以2");
	
	private Integer bitNum; //位数
	private Integer mulNum; //乘数
	private String explain; //阐述
	
	public static IdCardMulEnum getByBitNum(Integer bitNum){
		if (bitNum == null) {
			return null;
		}
		IdCardMulEnum[] values = IdCardMulEnum.values();
		for(IdCardMulEnum enum1 : values){
			if (bitNum.equals(enum1.getBitNum())) {
				return enum1;
			}
		}
		return null;
	}
	
	IdCardMulEnum(Integer bitNum, Integer mulNum, String explain){
		this.bitNum = bitNum;
		this.mulNum = mulNum;
		this.explain = explain;
	}

	public Integer getBitNum() {
		return bitNum;
	}

	public void setBitNum(Integer bitNum) {
		this.bitNum = bitNum;
	}

	public Integer getMulNum() {
		return mulNum;
	}

	public void setMulNum(Integer mulNum) {
		this.mulNum = mulNum;
	}

	public String getExplain() {
		return explain;
	}

	public void setExplain(String explain) {
		this.explain = explain;
	}

}

4.方法中涉及的身份证校验位枚举IdCardCheckBitEnum:

/**
 * 身份证校验位枚举
 * 说明:根据身份证校验规,计算出和值后,除11求余,余数对应如下校验位
 * @author ServerZhang
 * @date 2018年5月28日
 */
public enum IdCardCheckBitEnum {
	
	REMAINDER_0(0,'1',"余数为0,校验位为1"),
	REMAINDER_1(1,'0',"余数为1,校验位为0"),
	REMAINDER_2(2,'X',"余数为2,校验位为X"),
	REMAINDER_3(3,'9',"余数为3,校验位为9"),
	REMAINDER_4(4,'8',"余数为4,校验位为8"),
	REMAINDER_5(5,'7',"余数为5,校验位为7"),
	REMAINDER_6(6,'6',"余数为6,校验位为6"),
	REMAINDER_7(7,'5',"余数为7,校验位为5"),
	REMAINDER_8(8,'4',"余数为8,校验位为4"),
	REMAINDER_9(9,'3',"余数为9,校验位为3"),
	REMAINDER_10(10,'2',"余数为10,校验位为2");
	
	private Integer remainder; //余数
	private char checkBit; //校验位数字
	private String explain; //阐述
	
	public static IdCardCheckBitEnum getByRemainder(Integer remainder){
		if (remainder == null) {
			return null;
		}
		IdCardCheckBitEnum[] values = IdCardCheckBitEnum.values();
		for(IdCardCheckBitEnum enum1 : values){
			if (remainder.equals(enum1.getRemainder())) {
				return enum1;
			}
		}
		return null;
	}
	
	IdCardCheckBitEnum(Integer remainder, char checkBit, String explain){
		this.remainder = remainder;
		this.checkBit = checkBit;
		this.explain = explain;
	}

	public Integer getRemainder() {
		return remainder;
	}

	public void setRemainder(Integer remainder) {
		this.remainder = remainder;
	}

	public char getCheckBit() {
		return checkBit;
	}

	public void setCheckBit(char checkBit) {
		this.checkBit = checkBit;
	}

	public String getExplain() {
		return explain;
	}

	public void setExplain(String explain) {
		this.explain = explain;
	}
}

 

 

转载自原文链接, 如需删除请联系管理员。

原文链接:判断身份证校验位是否正确,转载请注明来源!

0