📜  南非身份证号码验证码 (1)

📅  最后修改于: 2023-12-03 15:22:49.746000             🧑  作者: Mango

介绍南非身份证号码验证码

南非身份证号码是由13个数字所组成的,它们可以被分为两部分,一部分是出生日期,另一部分是个人编号。

具体来说,南非身份证号码的格式为:YYMMDDSSSSCA,其中:

  • YY:出生年份的后两位数;
  • MM:出生月份,如果为20或21,则代表年份的后两位数为前缀,例如2001年的01;
  • DD:出生日期;
  • SSSS:个人编号,一般是由出生日期和性别编码组成;
  • C:第13位数字,代表性别,奇数代表男性,偶数代表女性;
  • A:第14位数字,代表身份证卡的种族,0代表非洲黑人、1代表马来人、2代表印度人、3代表白人、4代表其他。

南非身份证号码的第一个数字必须是1、2、3、4、5、6、7、8、9之一,这意味着南非身份证号码的第一个数字不能为0。

要验证南非身份证号码的有效性,需要使用一个称为Luhn算法的算法。

下面是使用Python编写的南非身份证号码验证程序:

def validate_sa_id_number(id_number: str) -> bool:
    if not id_number.isdigit() or len(id_number) != 13:
        return False

    # 验证第一位数字
    if id_number[0] not in '123456789':
        return False

    # 根据生日计算出年份和月份
    year_prefix = '19' if int(id_number[0]) in (1, 2) else '20'
    year = int(year_prefix + id_number[0:2])
    month = int(id_number[2:4])

    # 验证生日是否合法
    from datetime import datetime
    try:
        date = datetime.strptime(f'{year}-{month}-01', '%Y-%m-%d')
        if date.day != int(id_number[4:6]):
            return False
    except ValueError:
        return False

    # 验证Luhn算法
    table = [int(c) for c in id_number]
    for i in range(0, 12, 2):
        table[i] *= 2
        if table[i] > 9:
            table[i] -= 9
    return sum(table) % 10 == 0

以上的代码会验证输入的身份证号码是否符合南非身份证号码的格式要求,以及使用Luhn算法验证身份证号码的有效性。