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īme | Vērtība |
|---|---|
0–9 | 0–9 |
A B C … Z | 10, 11, 12 … 35 |
< | 0 |
Aprēķina piemērs
ICAO parauga pases dokumenta numurs ir L898902C3.
| Rakstzīme | Vērtība | Svars | Reizinājums |
|---|---|---|---|
| L | 21 | 7 | 147 |
| 8 | 8 | 3 | 24 |
| 9 | 9 | 1 | 9 |
| 8 | 8 | 7 | 56 |
| 9 | 9 | 3 | 27 |
| 0 | 0 | 1 | 0 |
| 2 | 2 | 7 | 14 |
| C | 12 | 3 | 36 |
| 3 | 3 | 1 | 3 |
| Summa | 316 | ||
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ā.