Kā darbojas MRZ kontrolcipars

Katram svarīgam mašīnlasāmās zonas laukam seko viens kontrolcipars. To aprēķina ar atkārtotiem svariem 7-3-1, kas noteikti ICAO Doc 9303 3. daļā.

Kontrolcipars: 6

Algoritms trīs soļos

Vispirms katru rakstzīmi pārvērš skaitlī. Cipari saglabā savu vērtību, burti no A līdz Z kļūst par 10 līdz 35, bet aizpildījuma rakstzīme < ir 0.

Pēc tam katru skaitli reizina ar svaru. Svari atkārtojas 7, 3, 1, 7, 3, 1 no lauka pirmās rakstzīmes līdz pēdējai.

Visbeidzot reizinājumus saskaita un summu dala ar 10. Atlikums ir kontrolcipars.

Rakstzīmju vērtības

RakstzīmeVērtība
0–90–9
A B C … Z10, 11, 12 … 35
<0

Aprēķina piemērs

ICAO parauga pases dokumenta numurs ir L898902C3.

RakstzīmeVērtībaSvarsReizinājums
L217147
88324
9919
88756
99327
0010
22714
C12336
3313
Summa316

Summa ir 316. Dalot ar 10, atlikums ir 6, tātad kontrolcipars ir 6. Parauga MRZ numurs ir uzdrukāts kā L898902C36.

Kuriem laukiem ir kontrolcipari

Dokumenta numuram, dzimšanas datumam un derīguma termiņam vienmēr ir savs kontrolcipars. TD3 pasēs pārbauda arī papildu datus (personas kodu). Noslēgumā kopējais kontrolcipars aptver dokumenta numuru, dzimšanas datumu, derīguma termiņu un papildu datus kopā ar to kontrolcipariem. Vīzām (MRV-A un MRV-B) kopējā kontrolcipara nav.

Ja TD3 pases papildu datos ir tikai aizpildījuma rakstzīmes, to kontrolcipars var būt < vai 0. Abi varianti ir pareizi.

Kods

JavaScript

function mrzCheckDigit(s) {
  const w = [7, 3, 1];
  let sum = 0;
  for (let i = 0; i < s.length; i++) {
    const c = s[i];
    const v = c === '<' ? 0 : /\d/.test(c) ? +c : c.charCodeAt(0) - 55;
    sum += v * w[i % 3];
  }
  return sum % 10;
}

mrzCheckDigit('L898902C3'); // 6

Python

def mrz_check_digit(s: str) -> int:
    weights = (7, 3, 1)
    total = 0
    for i, c in enumerate(s):
        v = 0 if c == '<' else int(c) if c.isdigit() else ord(c) - 55
        total += v * weights[i % 3]
    return total % 10

mrz_check_digit('L898902C3')  # 6

Biežākās kļūdas

Burtu vērtības skaita no 1, nevis no 10, svarus sāk no nepareizās rakstzīmes vai kopējā kontrolcipara aprēķinā neiekļauj lauku kontrolciparus. Lai pārbaudītu visu MRZ, nevis vienu lauku, ielīmējiet to MRZ pārbaudes rīkā.