基础知识:
第一步:将身份证号码的第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;
}
}
转载自原文链接, 如需删除请联系管理员。
原文链接:判断身份证校验位是否正确,转载请注明来源!