第三十七篇:JAVA验证身份证号是否合法

身份证作为居民的唯一标识。在很多系统中需要用户输入身份证号信息,今天我们就来编写一个方法验证身份证号的合法性。

首先我们来看看身份证号的编码规则: 
前1-2位数字表示:所在省(直辖市、自治区)的代码; 
第3-4位数字表示:所在地级市(自治州)的代码; 
第5-6位数字表示:所在区(县、自治县、县级市)的代码; 
第7-14位数字表示:出生年、月、日; 
第15-16位数字表示:所在地的派出所的代码; 
第17位数字表示性别:奇数表示男性,偶数表示女性; 
第18位数字是校检码:也有的说是个人信息码,不是随计算机的随机产生,它是 用来检验身份证的正确性。校检码可以是0-9的数字,有时也用X表示。

知道了规则之后,我们再来看看算法: 
第一步:将身份证号码的第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。

了解了身份证号的规则之后,我们就可以对其进行校验:

public class IDCardValidate
{
   public static boolean validate(String no)
   {
      // 对身份证号进行长度等简单判断
      if (no == null || no.length() != 18 || !no.matches("\\d{17}[0-9X]"))
      {
         return false;
      }
      // 1-17位相乘因子数组
      int[] factor = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
      // 18位随机码数组
      char[] random = "10X98765432".toCharArray();
      // 计算1-17位与相应因子乘积之和
      int total = 0;
      for (int i = 0; i < 17; i++)
      {
         total += Character.getNumericValue(no.charAt(i)) * factor[i];
      }
      // 判断随机码是否相等
      return random[total % 11] == no.charAt(17);
   }

   public static void main(String[] args)
   {
      // 正确
      System.out.println(validate("432831196411150810"));
      // 错误
      System.out.println(validate("432831196411150813"));
   }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值