资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 编程开发 >
Advertisement
文章正文

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

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   
  • 第二章 统一建模语言UML简介  
  • Tiger系列五:访问环境变量和调用子进程  
  • Struts的心酸往事  
  • 在JBOSS,TOCMAT上部署J2EE应用  
  • 如何编写不可维护的代码  
  • Mini Java编译器(二)——语法(BNF)  
  • 学习顺便翻译:理解jsp模式2架构——MVC设计模式探险  
  • 在eclipse 3 上配置jsp开发环境  
  • 解读JDO规范之ORM(四)  
  • J2SE Code Names  
  • 页面导航:

    正文内容:

      公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
     
    1、地址码
    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 gb/t 2260 的规定执行。

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

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

    4 、校验码
    校验码采用iso 7064:1983,mod 11-2 校验码系统。

      (1)十七位数字本体码加权求和公式
        s = sum(ai * wi), i = 0, ... , 16 ,先对前17位数字的权求和
        ai:表示第i位置上的身份证号码数字值
        wi:表示第i位置上的加权因子
        wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

      (2)计算模
        y = mod(s, 11)

      (3)通过模得到对应的校验码
        y:   0 1 2 3 4 5 6 7 8 9 10
        校验码: 1 0 x 9 8 7 6 5 4 3 2

    下面是java实现的代码

    /*
    * idcard.java created on 2004-11-5 17:03:37
    *
    */
    package org.yz21.study.idcard;

    /**
    * @author violin 2004-11-5 17:03:37
    *   copyright www.yz21.org 2003-2004
    */
    public class idcard {
    // wi =2(n-1)(mod 11)
    final int[] wi = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};

    // verify digit
    final int[] vi = {1,0,x,9,8,7,6,5,4,3,2};

    private int[] ai = new int[18];

    public idcard() {
    }

    //verify
    public boolean verify(string idcard) {
    if (idcard.length() == 15) {
    idcard = uptoeighteen(idcard);
    }
    if (idcard.length() != 18) {
    return false;
    }
    string verify = idcard.substring(17, 18);
    if (verify.equals(getverify(idcard))) {
    return true;
    }
    return false;
    }

    //get verify
    public string getverify(string eightcardid) {
    int remaining = 0;

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

    if (eightcardid.length() == 17) {
    int sum = 0;
    for (int i = 0; i < 17; i++) {
    string k = eightcardid.substring(i, i + 1);
    ai = integer.parseint(k);
    }

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

    return remaining == 2 ? "x" : string.valueof(vi[remaining]);
    }

    //15 update to 18
    public string uptoeighteen(string fifteencardid) {
    string eightcardid = fifteencardid.substring(0,6);
    eightcardid = eightcardid + "19";
    eightcardid = eightcardid + fifteencardid.substring(6,15);
    eightcardid = eightcardid + getverify(eightcardid);
    return eightcardid;
    }

    }

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

    /*
    * idcardtest.java created on 2004-11-5 17:32:12
    *
    */
    package org.yz21.study.idcard;

    import junit.framework.test;
    import junit.framework.testcase;
    import junit.framework.testsuite;

    /**
    * @author violin 2004-11-5 17:32:12
    *  copyright www.yz21.org 2003-2004
    */
    public class idcardtest extends testcase {

    private string idcard1 = "11010519491231002x";
    private string idcard2 = "440524188001010014";

    public void testverify() {
    idcard idcard = new idcard();
    this.asserttrue(idcard.verify(idcard1));
    this.asserttrue(idcard.verify(idcard2));
    }

    public static test suite() {
    return new testsuite(idcardtest.class);
    }

    public static void main(string[] args) {
    junit.textui.testrunner.run(suite());
    }
    }

    在线验证:http://www.yz21.org/common/idcard.jsp



     

     
    热门推荐笔记本: 清华同方笔记本
    相关文章:
    webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
    ©2007 popbb.net All Rights Reserved