Whiz Tools

CURP 生成器

介绍

CURP(Clave Única de Registro de Población)是墨西哥用于身份识别的唯一字母数字代码。该工具生成有效的随机 CURP 以用于测试场景,符合官方格式和验证规则。重要的是要注意,这些生成的 CURP 与真实个人无关,仅应用于测试目的。

CURP 的结构

CURP 由 18 个字符组成,格式如下:

  1. 父姓的第一个字母
  2. 父姓的第一个元音(不包括第一个字母)
  3. 母姓的第一个字母
  4. 名字的第一个字母 5-10. 出生日期(YYMMDD 格式)
  5. 性别(H 代表男性,M 代表女性) 12-13. 出生州的两个字母代码 14-16. 每个姓名组成部分的第一个内部辅音(父姓、母姓、名字)
  6. 区分数字(2000 年之前出生的人为 0-9,2000 年及之后出生的人为 A-Z)
  7. 校验位(0-9)

生成随机 CURP 的算法

  1. 生成姓名组成部分的随机字母
  2. 生成随机出生日期
  3. 随机选择性别
  4. 随机选择有效的州代码
  5. 生成姓名组成部分的随机辅音
  6. 根据出生年份确定区分数字
  7. 计算校验位
  8. 将所有组成部分组合形成 CURP

验证规则

  • 所有字母字符必须为大写
  • 出生日期必须是有效日期(包括闰年考虑)
  • 州代码必须是有效的墨西哥州代码
  • 区分数字必须与出生年份相对应
  • 校验位必须正确计算
  • 处理姓名的特殊情况(例如,单字母姓氏、包含 Ñ 的名字)

用例

  1. 软件测试:开发人员可以使用该工具生成有效的 CURP,用于测试用户注册系统、数据库操作或任何需要 CURP 输入的软件。

  2. 数据隐私:在演示软件或展示数据时,使用随机生成的 CURP 有助于保护个人隐私。

  3. 性能测试:生成大量唯一的 CURP 以测试系统在负载下的性能。

  4. 培训和教育:在有关墨西哥身份识别系统的教育材料中使用生成的 CURP,而不使用真实个人数据。

CURP 在墨西哥的历史

CURP 系统于 1996 年由墨西哥政府引入,作为现代化和标准化个人识别的一部分。它取代了各种其他识别系统,成为墨西哥官僚机构的重要组成部分,用于从学校注册到报税的各个方面。

多年来,CURP 系统经历了几次修改:

  • 2011 年,引入了区分数字,以区分 2000 年之前和之后出生的人。
  • 2012 年,修改了校验位的计算算法,以提高唯一性。

示例

以下是用各种编程语言生成随机 CURP 的代码示例:

import random
import string
from datetime import datetime, timedelta

def generate_curp():
    # 生成姓名组成部分
    paternal = random.choice(string.ascii_uppercase) + random.choice('AEIOU')
    maternal = random.choice(string.ascii_uppercase)
    given = random.choice(string.ascii_uppercase)

    # 生成出生日期
    start_date = datetime(1940, 1, 1)
    end_date = datetime.now()
    random_date = start_date + timedelta(days=random.randint(0, (end_date - start_date).days))
    date_str = random_date.strftime("%y%m%d")

    # 生成性别
    gender = random.choice(['H', 'M'])

    # 生成州代码
    states = ['AS', 'BC', 'BS', 'CC', 'CL', 'CM', 'CS', 'CH', 'DF', 'DG', 'GT', 'GR', 'HG', 'JC', 'MC', 'MN', 'MS', 'NT', 'NL', 'OC', 'PL', 'QT', 'QR', 'SP', 'SL', 'SR', 'TC', 'TS', 'TL', 'VZ', 'YN', 'ZS']
    state = random.choice(states)

    # 生成辅音
    consonants = ''.join(random.choices(string.ascii_uppercase.translate(str.maketrans('', '', 'AEIOU')), k=3))

    # 生成区分数字
    diff_digit = random.choice(string.digits) if int(date_str[:2]) < 20 else random.choice(string.ascii_uppercase)

    # 生成校验位(此示例简化处理)
    check_digit = random.choice(string.digits)

    return f"{paternal}{maternal}{given}{date_str}{gender}{state}{consonants}{diff_digit}{check_digit}"

## 生成并打印随机 CURP
print(generate_curp())
function generateCURP() {
    const vowels = 'AEIOU';
    const consonants = 'BCDFGHJKLMNPQRSTVWXYZ';
    const states = ['AS', 'BC', 'BS', 'CC', 'CL', 'CM', 'CS', 'CH', 'DF', 'DG', 'GT', 'GR', 'HG', 'JC', 'MC', 'MN', 'MS', 'NT', 'NL', 'OC', 'PL', 'QT', 'QR', 'SP', 'SL', 'SR', 'TC', 'TS', 'TL', 'VZ', 'YN', 'ZS'];

    const randomLetter = () => String.fromCharCode(65 + Math.floor(Math.random() * 26));
    const randomVowel = () => vowels[Math.floor(Math.random() * vowels.length)];
    const randomConsonant = () => consonants[Math.floor(Math.random() * consonants.length)];

    const paternal = randomLetter() + randomVowel();
    const maternal = randomLetter();
    const given = randomLetter();

    const now = new Date();
    const start = new Date(1940, 0, 1);
    const randomDate = new Date(start.getTime() + Math.random() * (now.getTime() - start.getTime()));
    const dateStr = randomDate.toISOString().slice(2, 10).replace(/-/g, '');

    const gender = Math.random() < 0.5 ? 'H' : 'M';
    const state = states[Math.floor(Math.random() * states.length)];

    const internalConsonants = randomConsonant() + randomConsonant() + randomConsonant();

    const diffDigit = parseInt(dateStr.slice(0, 2)) < 20 ? 
        Math.floor(Math.random() * 10).toString() :
        String.fromCharCode(65 + Math.floor(Math.random() * 26));

    const checkDigit = Math.floor(Math.random() * 10).toString();

    return `${paternal}${maternal}${given}${dateStr}${gender}${state}${internalConsonants}${diffDigit}${checkDigit}`;
}

// 生成并记录随机 CURP
console.log(generateCURP());

其他国家的替代方案

虽然 CURP 是墨西哥特有的,但其他国家有类似的识别系统:

  1. 美国:社会安全号码(SSN)
  2. 加拿大:社会保险号码(SIN)
  3. 印度:Aadhaar 号码
  4. 巴西:Cadastro de Pessoas Físicas(CPF)

每个系统都有其自身的结构和规则,但它们在各自国家中发挥着类似的作用。

参考文献

  1. SEGOB(Secretaría de Gobernación)。“CURP - Trámites。”墨西哥政府,https://www.gob.mx/curp/。访问日期 2024 年 8 月 4 日。
  2. RENAPO(Registro Nacional de Población e Identidad)。“分配唯一人口登记代码的规范说明。”墨西哥政府,https://www.gob.mx/cms/uploads/attachment/file/79053/InstructivoNormativoCURP.pdf。访问日期 2024 年 8 月 4 日。
Feedback