Tools - ID number verification and upgrade

ID number verification and upgrade

 

1. 18-digit ID card

 

Citizen's 18-digit ID number consists of: address code (6 digits) + date of birth code (8 digits) +  sequence code (3 digits) +  check code (1 digit)

 

address code

1-2 codes of provinces, autonomous regions and municipalities directly under the Central Government
3-4 codes of prefecture-level cities, leagues and autonomous prefectures
5-6 codes of counties, county-level cities and districts

 

sequence code

Indicates the sequence numbers assigned to people born in the same year, month, and day within the area identified by the same address code. The odd number of the sequence code is assigned to males, and the even numbers are assigned to females.

 

check code

As the check digit of the tail number, it is calculated by the number compiling unit according to a unified formula. The calculation formula is as follows:

1. Multiply the previous 17-digit ID number by different coefficients. The coefficients from the first to the seventeenth are: 7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2.
2. Add the result of multiplying the 17-bit number by the coefficient.
3. Add and divide by 11, what is the remainder?
4. The remainder can only have 11 numbers 0-1-2-3-4-5-6-7-8-9-10. The numbers corresponding to the last ID card respectively are 1-0-X-9-8-7-6-5-4-3-2. (i.e. the remainder 0 corresponds to 1, the remainder 1 corresponds to 0, the remainder 2 corresponds to X...)
5. From the above, we know that if the remainder is 3, 9 will appear on the 18th digit of the ID card. If the corresponding number is 2, the last digit of the ID card is the Roman numeral x.

 

Two, 15 ID cards

 

The first-generation ID card is 15 digits, of which six digits are the address code (same as 18 digits), but the date of birth is only the year, without the century 19, the three-digit sequence code, and no check code.

 

When upgrading, you need to add century 19 after the six-digit address code (because the 15-digit ID cards are all before 2000, and the ID cards after that are all 18-digit), and a check code is also generated .

 

18-digit ID number verification

 

Boolean verifyIdNumber(String idNumber)
{
    def city = [11: "北京",
        12: "天津",
        13: "河北",
        14: "山西",
        15: "内蒙古",
        21: "辽宁",
        22: "吉林",
        23: "黑龙江 ",
        31: "上海",
        32: "江苏",
        33: "浙江",
        34: "安徽",
        35: "福建",
        36: "江西",
        37: "山东",
        41: "河南",
        42: "湖北 ",
        43: "湖南",
        44: "广东",
        45: "广西",
        46: "海南",
        50: "重庆",
        51: "四川",
        52: "贵州",
        53: "云南",
        54: "西藏 ",
        61: "陕西",
        62: "甘肃",
        63: "青海",
        64: "宁夏",
        65: "新疆",
        71: "台湾",
        81: "香港",
        82: "澳门",
        91: "国外 "]
    if (!(idNumber?.matches(/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/)))
    {
        return false
    }
    else if (!city[Integer.parseInt(idNumber?.substring(0, 2))])
    {
        return false
    }
    else
    {
        if (idNumber?.length() == 18)
        {
            def factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
            def parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
            def sum = 0
            def ai = 0
            def wi = 0
            for (int i = 0; i < 17; i++)
            {
                ai = Integer.parseInt(String.valueOf(idNumber?.charAt(i)))
                wi = factor[i]
                sum += ai * wi
            }
            def index = sum % 11
            if (index == 2 && idNumber[17] != 'x' && idNumber[17] != 'X')
            {
                return false
            }
            if (index != 2 && parity[index] != idNumber[17])
            {
                return false
            }
        } 
    }
    return true
}

 

15位身份证号码升级

 

def getNewIdNumber(String oldId)
{
    if(oldId && oldId.matches(/^\d{15}$/))
    {
        StringBuilder newId = new StringBuilder()
        newId.append(oldId.substring(0, 6)).append("19").append(oldId.substring(6))
        newId.append(getVerifyCode(newId.toString()))
        
        // 18位身份证号码校验
        if (verifyIdNumber(newId.toString()))
        {
         return newId.toString()
        }
    }
}

def getVerifyCode(String oldId)
{
    def factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    def parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    def sum = 0
    def ai = 0
    def wi = 0
    for (int i = 0; i < 17; i++)
    {
        ai = Integer.parseInt(String.valueOf(oldId?.charAt(i)))
        wi = factor[i]
        sum += ai * wi
    }
    def index = sum % 11
    return parity[index]
}

 

 

 

 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326447545&siteId=291194637