身份证号码分析

身份证号码规则

摘自百度:

[根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。]


身份证工具方法


中华人民共和国居民身份证由两种,一种是15位身份证号码,一种是18位身份证号码.

以下是总结了一些身份证常用方法.不是很完整.
package cn.com.jody.util;   
  
/**  
 * 功能/模块:工具类<br>  
 * 类描述:身份证工具类  
 *   
 * @author JODY    
 */  
public class CardUtil {   
    // 经过计算得出的指数数组,算法:2的n-1次方求和,除以11取模   
    // 如:2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4   
    // 加权因子   
    static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };   
  
    // 校验位数组   
    static char[] ai = { '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2' };   
  
    /**  
     * 根据15位身份证号和出生日期计算得出18位身份证号  
     *   
     * @param id15,15位身份证号  
     * @param birthday出生日期,19820329  
     * @return id18,返回18位身份证号  
     */  
    public static String id15To18Number(String id15, String birthday) {   
        if (isNullEmpty(id15) || id15.length() != 15 || isNullEmpty(birthday) || birthday.length() != 8) {   
            return null;   
        } else {   
            return id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6) + ai[checkBit(id15, birthday)];   
        }   
    }   
  
    /**  
     * 判断字符串是否为null或者长度是否为0  
     *   
     * @param text  
     *            字符串  
     * @return boolean  
     */  
    public static boolean isNullEmpty(String text) {   
        if (null == text) {   
            return true;   
        } else if (0 == text.length()) {   
            return true;   
        }   
        return false;   
    }   
  
    /**  
     *   
     * 根据15位身份证号和出生日期,计算校验位  
     *   
     * @param id15,15位身份证号  
     * @param birthday出生日期,19820329  
     * @return mod,第18位校验位,用于从ai数组取数作为身份证号的最后一位,即ai[mod]  
     */  
    public static int checkBit(String id15, String birthday) {   
        id15 = id15.substring(0, 6) + birthday.substring(0, 2) + id15.substring(6);   
        int sum = 0;   
        // 计算校验位,前17位加权求和,然后除以11取模   
        // S = Sum(Ai * Wi), i = 0, ... , 16 ,对前17位数字的权求和   
        // Ai:表示第i位置上的身份证号码数字值   
        // Wi:表示第i位置上的加权因子   
        for (int i = 1; i < id15.length() + 1; i++) {   
            sum = sum + wi[i - 1] * (Integer.parseInt(id15.substring(i - 1, i)));   
        }   
        int mod = sum % 11;   
        return mod;   
    }   
  
    /**  
     * 根据传入的18位身份证号,计算校验位  
     *   
     * @param id,18位身份证号  
     * @return mod,返回校验位,用于从ai数组取数作为身份证号的校验位,即ai[mod]  
     */  
    public static int checkBit(String id) {   
        String id17 = id.substring(0, 17);   
        int sum = 0;   
        for (int i = 0; i < id17.length(); i++) {   
            int ai = Integer.parseInt(id17.substring(i, i + 1));   
            sum += wi[i] * ai;   
        }   
        int mod = sum % 11;   
        return mod;   
    }   
  
    /**  
     * 校验15位身份证号与出生日期  
     *   
     * @param id,15位身份证号  
     * @param birthday,出生日期8位(19820329)  
     * @return result  
     */  
    public static boolean checkId15BirthDay(String id, String birthday) {   
        boolean result = false;   
        String birth_id = id.substring(6, 12);// 6位日期   
        String birth = birthday.substring(2);   
        // 检验日期,出生日期与身份证中的出生日期相符,然后检验性别   
        if (birth_id.equals(birth)) {   
            result = true;   
        } else {   
            // 出生日期与身份证中的出生日期不相符   
            result = false;   
        }   
        return result;   
    }   
  
    /**  
     * 校验15位身份证号与性别  
     *   
     * @param id,15位身份证号  
     * @param sex,性别,  
     *            0-女 1-男  
     * @return result  
     */  
    public static boolean checkId15Sex(String id, Integer sex) {   
        boolean result = false;   
  
        String temp = id.substring(14);// 最后一位代表性别   
        int isex = Integer.parseInt(temp);   
        // 男为奇数,女为偶数   
        if (isex % 2 == sex) {   
            result = true;   
        } else {   
            result = false;   
        }   
        return result;   
    }   
  
    /**  
     * 校验18位身份证号  
     *   
     * @param id,18位身份证号  
     * @param birthday,出生日期8位(19820329)  
     * @param sex,性别, 0-女,1-男  
     * @return result  
     */  
    public static boolean checkId18BirthDay(String id, String birthday) {   
        boolean result = false;   
        String birth_id = id.substring(6, 14);// 8位日期   
        // 检验日期,出生日期与身份证中的出生日期相符,然后检验性别   
        if (birth_id.equals(birthday)) {   
            result = true;   
        } else {   
            // 出生日期与身份证中的出生日期不相符   
            result = false;   
        }   
        return result;   
    }   
  
    /**  
     * 校验18位身份证号  
     *   
     * @param id,18位身份证号  
     * @param birthday,出生日期8位(19820329)  
     * @param sex,性别,0-女,1-男  
     * @return result  
     */  
    public static boolean checkId18Sex(String id, Integer sex) {   
        boolean result = false;   
        String temp = id.substring(16, 17);// 倒数第二位代表性别   
        int isex = Integer.parseInt(temp);   
        // 男为奇数,女为偶数   
        if (isex % 2 == sex) {   
            result = true;   
        } else {   
            result = false;   
        }   
        return result;   
    }   
  
    /**  
     * 获取18位身份证号的出生日期  
     *   
     * @param id  
     * @return  
     */  
    public static String getId18Birthday(String id) {   
        if (isNullEmpty(id) || id.length() != 18)   
            return null;   
        String birthday = id.substring(6, 14);// 8位日期;   
        return birthday;   
    }   
  
    /**  
     * 获取18位身份证号的性别  
     *   
     * @param id  
     * @return  
     */  
    public static Integer getId18Sex(String id) {   
        if (isNullEmpty(id) || id.length() != 18)   
            return null;   
        String temp = id.substring(16, 17);// 倒数第二位代表性别   
        int isex = Integer.parseInt(temp);   
        // 男为奇数,女为偶数   
        // 性别 0-女 1-男   
        if (isex % 2 == 0) {   
            return 0;   
        } else {   
            return 1;   
        }   
    }   
  
    /**  
     * 验证身份证号码是否正确  
     *   
     * @param id,18位身份证号码  
     * @return true 正常,false 错误  
     */  
    public static boolean validId18(String id) {   
        if (validId18IsNumber(id) && validId18IsBirthday(id) && validId18IsBit(id))   
            return true;   
        else  
            return false;   
    }   
  
    /**  
     * 验证身份证字符是否为合法  
     *   
     * @param id,18位身份证号码  
     * @return true 正常,false 错误  
     */  
    public static boolean validId18IsNumber(String id) {   
        if (isNullEmpty(id) || id.length() != 18)   
            return false;   
        // 验证前17位是否为数字   
        for (int i = 0; i < 17; i++) {   
            if (id.charAt(i) < '0' || id.charAt(i) > '9')   
                return false;   
        }   
        return true;   
    }   
  
    /**  
     * 验证身份证出生日期是否合法  
     *   
     * @param id,18位身份证号码  
     * @return true 正常,false 错误  
     */  
    public static boolean validId18IsBirthday(String id) {   
        if (isNullEmpty(id) || id.length() != 18)   
            return false;   
        // 验证出生日期   
        int y = Integer.parseInt(id.substring(6, 10));   
        int m = Integer.parseInt(id.substring(10, 12));   
        int d = Integer.parseInt(id.substring(12, 14));   
        if (y < 1900 || m < 1 || m > 12 || d < 1 || d > 31 || ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) || (m == 2 && ((y % 4 > 0 && d > 28) || d > 29)))   
            return false;   
        return true;   
    }   
  
    /**  
     * 验证身份证验证数是否正确  
     *   
     * @param id,18位身份证号码  
     * @return true 正常,false 错误  
     */  
    public static boolean validId18IsBit(String id) {   
        if (isNullEmpty(id) || id.length() != 18)   
            return false;   
        // 验证身份证验证位   
        String bit = id.substring(17);   
        String tbit = String.valueOf(ai[checkBit(id)]);   
        if (!bit.equals(tbit))   
            return false;   
        return true;   
    }   
  
    public static void main(String[] args) {   
        System.out.println(CardUtil.validId18("43102819841s312434"));   
    }   
}  



你可能感兴趣的:(算法,百度)