Whiz Tools

Generador de CURP

Introducció

El CURP (Clave Única de Registro de Población) és un codi alfanumèric únic utilitzat a Mèxic per a fins d'identificació. Aquesta eina genera CURPs vàlids i aleatoris per a escenaris de prova, complint amb el format oficial i les regles de validació. És important notar que aquests CURPs generats no estan vinculats a persones reals i només s'han d'utilitzar per a fins de prova.

Estructura del CURP

Un CURP consisteix en 18 caràcters en el següent format:

  1. Primera lletra del cognom paterno
  2. Primera vocal del cognom paterno (excloent la primera lletra)
  3. Primera lletra del cognom matern
  4. Primera lletra del nom 5-10. Data de naixement (format YYMMDD)
  5. Gènere (H per a homes, M per a dones) 12-13. Codi de dues lletres per a l'estat de naixement 14-16. Primera consonant interna de cada component del nom (cognom paterno, cognom matern, nom)
  6. Dígit de diferenciació (0-9 per a persones nascudes abans de 2000, A-Z per a les nascudes a partir de 2000)
  7. Dígit de control (0-9)

Algoritme per a generar un CURP aleatori

  1. Generar lletres aleatòries per als components del nom
  2. Generar una data de naixement aleatòria
  3. Seleccionar aleatòriament el gènere
  4. Seleccionar aleatòriament un codi d'estat vàlid
  5. Generar consonants aleatòries per als components interns del nom
  6. Determinar el dígit de diferenciació en funció de l'any de naixement
  7. Calcular el dígit de control
  8. Combinar tots els components per formar el CURP

Regles de validació

  • Tots els caràcters alfabètics han de ser en majúscules
  • La data de naixement ha de ser una data vàlida (incloent la consideració d'anys de traspàs)
  • El codi d'estat ha de ser un codi d'estat mexicà vàlid
  • El dígit de diferenciació ha de correspondre amb l'any de naixement
  • El dígit de control ha de ser calculat correctament
  • Gestionar casos especials per als noms (per exemple, cognoms de lletra única, noms amb Ñ)

Casos d'ús

  1. Proves de programari: Els desenvolupadors poden utilitzar aquesta eina per generar CURPs vàlids per a provar sistemes d'inscripció d'usuaris, operacions de base de dades o qualsevol programari que requereixi entrada de CURP.

  2. Privadesa de dades: En demostrar programari o presentar dades, utilitzar CURPs generats aleatòriament ajuda a protegir la privadesa dels individus.

  3. Proves de rendiment: Generar grans conjunts de CURPs únics per provar el rendiment del sistema sota càrrega.

  4. Formació i educació: Utilitzar CURPs generats en materials educatius sobre sistemes d'identificació mexicans sense utilitzar dades personals reals.

Història del CURP a Mèxic

El sistema CURP es va introduir el 1996 pel govern mexicà com a part d'un esforç per modernitzar i estandarditzar la identificació personal. Va substituir diversos altres sistemes d'identificació i es va convertir en un element crucial de la burocràcia mexicana, utilitzat per a tot, des de l'inscripció escolar fins a la presentació d'impostos.

Al llarg dels anys, el sistema CURP ha sofert diverses modificacions:

  • El 2011, es va introduir el dígit de diferenciació per distingir entre persones nascudes abans i després de 2000.
  • El 2012, s'ha modificat l'algoritme per calcular el dígit de control per millorar la unicitat.

Exemples

Aquí hi ha exemples de codi per generar CURPs aleatoris en diversos llenguatges de programació:

import random
import string
from datetime import datetime, timedelta

def generate_curp():
    # Generar components del nom
    paternal = random.choice(string.ascii_uppercase) + random.choice('AEIOU')
    maternal = random.choice(string.ascii_uppercase)
    given = random.choice(string.ascii_uppercase)

    # Generar data de naixement
    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")

    # Generar gènere
    gender = random.choice(['H', 'M'])

    # Generar codi d'estat
    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)

    # Generar consonants
    consonants = ''.join(random.choices(string.ascii_uppercase.translate(str.maketrans('', '', 'AEIOU')), k=3))

    # Generar dígit de diferenciació
    diff_digit = random.choice(string.digits) if int(date_str[:2]) < 20 else random.choice(string.ascii_uppercase)

    # Generar dígit de control (simplificat per a aquest exemple)
    check_digit = random.choice(string.digits)

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

## Generar i imprimir un CURP aleatori
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}`;
}

// Generar i registrar un CURP aleatori
console.log(generateCURP());

Alternatives en altres països

Si bé el CURP és únic a Mèxic, altres països tenen sistemes d'identificació similars:

  1. Estats Units: Número de Seguretat Social (SSN)
  2. Canadà: Número d'Assegurança Social (SIN)
  3. Índia: Número Aadhaar
  4. Brasil: Cadastro de Pessoas Físicas (CPF)

Cada sistema té la seva pròpia estructura i regles, però serveixen a fins similars en els seus respectius països.

Referències

  1. SEGOB (Secretaría de Gobernación). "CURP - Tràmits." Gobierno de México, https://www.gob.mx/curp/. Accedit el 4 d'agost de 2024.
  2. RENAPO (Registro Nacional de Población e Identidad). "Instructiu Normatiu per a l'Assignació de la Clau Única de Registro de Población." Gobierno de México, https://www.gob.mx/cms/uploads/attachment/file/79053/InstructivoNormativoCURP.pdf. Accedit el 4 d'agost de 2024.
Feedback