如何编写一个高效验证身份证号码的JavaScript方法?

50 min read

好的,以下是验证身份证号的方法:

def verify_id(id_number):
    """
    验证身份证号码是否符合规则
    :param id_number: 身份证号码
    :return: True 或 False
    """
    if not isinstance(id_number, str):
        return False

    # 长度只能是15或18
    if len(id_number) != 15 and len(id_number) != 18:
        return False

    # 18位号码末尾可能是数字或X
    if len(id_number) == 18 and not (id_number[-1].isdigit() or id_number[-1].upper() == 'X'):
        return False

    # 省级代码验证
    provinces = {
        '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': '国外'
    }
    province_code = id_number[:2]
    if province_code not in provinces:
        return False

    # 出生日期验证
    if len(id_number) == 15:
        birth_year = int('19' + id_number[6:8])
        birth_month = int(id_number[8:10])
        birth_day = int(id_number[10:12])
    else:
        birth_year = int(id_number[6:10])
        birth_month = int(id_number[10:12])
        birth_day = int(id_number[12:14])

    # 检查年、月、日是否合法
    import datetime
    try:
        birth_date = datetime.date(birth_year, birth_month, birth_day)
    except ValueError:
        return False

    # 校验码验证
    if len(id_number) == 18:
        # 加权因子
        weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        # 校验码
        check_code = ['1', '0', 'X', '9', '8', 
                      '7', '6', '5', '4', '3', '2']
        check_sum = 0
        for i in range(17):
            check_sum += int(id_number[i]) * weight_factor[i]
        remainder = check_sum % 11
        if check_code[remainder] != id_number[-1].upper():
            return False

    return True

该方法基于身份证号基本规则进行验证,包括长度、省级代码、出生日期和校验码。其中,身份证号长度只能是15或18位,且18位号码末尾可能是数字或字母X;省级代码必须是规则中所列出的代码;出生日期必须合法,即年、月、日都要符合要求;校验码是18位身份证号的最后一位,由其他字符经过加权求和再取模得到,并且要满足校验规则。