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. 出生州の2文字コード 14-16. 各名前要素の最初の内部子音(父姓、母姓、名前)
  6. 差別化数字(2000年以前に生まれた人は0-9、2000年以降に生まれた人はA-Z)
  7. チェック数字(0-9)

ランダムCURP生成のアルゴリズム

  1. 名前要素のランダム文字を生成
  2. ランダムな生年月日を生成
  3. 性別をランダムに選択
  4. 有効な州コードをランダムに選択
  5. 内部名前要素のランダム子音を生成
  6. 生年に基づいて差別化数字を決定
  7. チェック数字を計算
  8. すべての要素を組み合わせてCURPを形成

検証ルール

  • すべてのアルファベット文字は大文字でなければならない
  • 生年月日は有効な日付でなければならない(うるう年の考慮を含む)
  • 州コードは有効なメキシコの州コードでなければならない
  • 差別化数字は生年に対応していなければならない
  • チェック数字は正しく計算されていなければならない
  • 名前の特別なケースを処理する(例:1文字の姓、Ñを含む名前)

ユースケース

  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. インド:アーダール番号
  4. ブラジル:Cadastro de Pessoas Físicas(CPF)

各システムには独自の構造とルールがありますが、それぞれの国で同様の目的を果たしています。

参考文献

  1. SEGOB(内務省)。“CURP - 手続き。” メキシコ政府、https://www.gob.mx/curp/。2024年8月4日アクセス。
  2. RENAPO(国民登録とアイデンティティ登録)。“CURPのための規範的指導書。” メキシコ政府、https://www.gob.mx/cms/uploads/attachment/file/79053/InstructivoNormativoCURP.pdf。2024年8月4日アクセス。
Feedback