新闻正文

java实现的18位身份证格式验证算法

来源:JAVA天堂  JAVA学习者  2007-7-10 01:45:49 网友评论 0 条 字体:[ ] ~我要投稿!
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。1、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

  2、出生日期码表示编码对象出生的年、月、日,按GB/T7408的规定执行。年、月、日代码之间不用分隔符。例:某人出生日期为1966年10月26日,其出生日期码为19661026。

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

  4、校验码校验码采用ISO7064:1983,MOD11-2校验码系统。

  1)十七位数字本体码加权求和公式 S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi:7910584216379105842

  2)计算模 Y=mod(S,11)

  3)通过模得到对应的校验码 :012345678910 验码:10X98765432

  下面是java实现的代码

  /**IDCard.javaCreatedon2004-11-517:03:37**/packageorg.yz21.study.idcard;

  /***@authorviolin2004-11-517:03:37*Copyrightwww.yz21.org2003-2004*/publicclassIDCard{//wi=2(n-1)(mod11)finalint[]wi={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};

  //verifydigitfinalint[]vi={1,0,X,9,8,7,6,5,4,3,2};

  privateint[]ai=newint[18];

  publicIDCard(){}

  //verifypublicbooleanVerify(Stringidcard){if(idcard.length()==15){idcard=uptoeighteen(idcard);}if(idcard.length()!=18){returnfalse;}Stringverify=idcard.substring(17,18);if(verify.equals(getVerify(idcard))){returntrue;}returnfalse;}

  //getverifypublicStringgetVerify(Stringeightcardid){intremaining=0;

  if(eightcardid.length()==18){eightcardid=eightcardid.substring(0,17);}

  if(eightcardid.length()==17){intsum=0;for(inti=0;i<17;i++){Stringk=eightcardid.substring(i,i+1);ai=Integer.parseInt(k);}

  for(inti=0;i<17;i++){sum=sum+wi*ai;}remaining=sum%11;}

  returnremaining==2?"X":String.valueOf(vi[remaining]);}

  //15updateto18publicStringuptoeighteen(Stringfifteencardid){Stringeightcardid=fifteencardid.substring(0,6);eightcardid=eightcardid+"19";eightcardid=eightcardid+fifteencardid.substring(6,15);eightcardid=eightcardid+getVerify(eightcardid);returneightcardid;}

  }

  测试代码:使用的单元测试工具是junit

  /**IDCardTest.javaCreatedon2004-11-517:32:12**/packageorg.yz21.study.idcard;

  importjunit.framework.Test;importjunit.framework.TestCase;importjunit.framework.TestSuite;

  /***@authorviolin2004-11-517:32:12*Copyrightwww.yz21.org2003-2004*/publicclassIDCardTestextendsTestCase{

  privateStringidcard1="11010519491231002X";privateStringidcard2="440524188001010014";

  publicvoidtestVerify(){IDCardidcard=newIDCard();this.assertTrue(idcard.Verify(idcard1));this.assertTrue(idcard.Verify(idcard2));}

  publicstaticTestsuite(){returnnewTestSuite(IDCardTest.class);}

  publicstaticvoidmain(String[]args){junit.textui.TestRunner.run(suite());}}



收藏到ViVi   收藏此页到365Key
上一篇:如何设定执行Java的Linux安全环境
下一篇:用java读取各种计算机文件系统的文件列表
用户名:新注册) 密码: 匿名评论 [所有评论]
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
本栏搜索
  • Google
   网站首页 -  网站地图 -  技术学习 -  网站投稿 -  帮助中心
Copyright 2003-2008 www.javah.net All Rights Reserved
2008 如果你喜欢本站 请收藏本站 并推荐给你的朋友一起分享