Vraag tien landen hoe een nationaal identiteitsnummer eruitziet en je krijgt tien verschillende antwoorden, niet omdat de nummers geheim zijn maar omdat elk register op zichzelf is ontworpen. Sommige staten publiceren de rekenkunde die het nummer sluit, sommige publiceren alleen een beschrijving van de vorm, en sommige publiceren niets meer dan het feit dat het nummer bestaat.
Die ongelijkmatigheid is het kenmerkende van dit vakgebied, en het is de reden dat een generieke internationale validator niet kan worden geschreven. Wat wel kan worden geschreven is een validator die voor elk land dat hij ondersteunt weet hoeveel hij mag controleren — en dat ronduit in de uitspraak zegt.
Waarom kunnen nationale ID-nummers niet allemaal op dezelfde manier worden gevalideerd?
Omdat er geen internationale autoriteit is die nationale identiteitsnummers uitgeeft. Elk nummer hoort bij een nationaal register met zijn eigen wetgeving, zijn eigen conventies en zijn eigen geschiedenis, en niets verplicht een land zijn nummering voor buitenstaanders te documenteren.
Waar documentatie bestaat, verschilt die ook in soort. Een gepubliceerd controlecijferalgoritme is een volledige specificatie: gegeven een kandidaatreeks kan de rekenkunde beslissen. Een gepubliceerd formaat is een gedeeltelijke specificatie: het kan een misvormde reeks afwijzen maar nooit een goed gevormde als echt goedkeuren. Een register dat geen van beide publiceert, laat de buitenwereld niets om te implementeren, wat de interne logica van het nummer ook moge zijn.
Rond die verscheidenheid ontwerpen betekent de dekking behandelen als een matrix in plaats van een boolean. Noteer voor elk land dat je product raakt welk van de drie niveaus geldt, en laat de uitspraak uit het niveau volgen in plaats van te doen alsof elk land dezelfde garantie biedt.
Alle identiteitswaarden die hier worden besproken zijn illustratieve beschrijvingen van gepubliceerde regels in plaats van reproducties. Geen echt identiteitsnummer komt in dit artikel voor, en het beschrijven van een regel impliceert niet dat een bepaalde reeks ooit is uitgegeven.
Landen die hun controlecijferalgoritme publiceren
Sommige registers specificeren het afsluitende teken volledig: de gewichten, de modulus en de regel voor het laatste cijfer staan allemaal in de openbare documentatie. Dat zijn de gemakkelijkste gevallen, en daar voegt een validator ook de meeste waarde toe, omdat een enkel verkeerd getypt teken wordt gevangen voordat het nummer enig register bereikt.
De familie van rekenkunde die erbij hoort is de gebruikelijke op modulus gebaseerde, besproken in controlecijferalgoritmen, en een nationaal schema is meestal een specifieke parameterset daarbinnen. Een handvol landen past het verdubbel-en-som-lid van de familie mod-10 toe; andere gebruiken een mod-11-opzet, en daarom verschilt de omzetting van rest naar teken van geval tot geval.
Zelfs hier doet precisie ertoe. Weten dat een land een modulaire controle gebruikt is niet hetzelfde als zijn parameters kennen, en het implementeren van een plausibele benadering levert een routine op die de meeste waarden accepteert en het stil oneens is met de standaard op de rest.
Landen die een formaat publiceren maar geen algoritme
De middelste laag is de grootste en de lastigste. Het register documenteert hoeveel tekens een nummer bevat, welke ervan cijfers zijn, en vaak welk onderdeel een regio of een geboorteperiode identificeert, maar het publiceert nooit een rekenkundige regel. Het Amerikaanse social security number en India’s permanent account number zitten beide in deze laag — veel gebruikt, grondig gedocumenteerd in vorm, en zonder enig openbaar controlecijferalgoritme.
Een validator die tegenover een formaat-only-schema staat, kan nog steeds nuttig werk doen. Hij kan reeksen van de verkeerde omvang afwijzen, reeksen met onwettige tekens en reeksen die de gedocumenteerde structuur van onderdelen tegenspreken. Wat hij niet kan, is iets uit het lichaam berekenen en vergelijken, want er is niets gepubliceerd om te berekenen.
De uitspraak moet dat weerspiegelen. Een formaat-only-schema levert een formaat-only-resultaat op, en de tekst moet zeggen dat de vorm is bevestigd terwijl geldigheid niet kan worden bevestigd. Zo’n waarde als geldig rapporteren is een onwaarheid van precies het soort dat het vocabulaire van vier uitspraken bestaat om te voorkomen.
Wat gebeurt er wanneer één nummer bij meerdere landen past?
Twee landen kunnen het bij toeval eens zijn. Als beide een vergelijkbare lengte en een vergelijkbare tekenset gebruiken, kan één reeks volledig aan beide regelsets voldoen — en als de twee schema’s ook vergelijkbare rekenkunde gebruiken, kan dezelfde reeks zelfs beide controlecijfers halen. Er is niets misgegaan; overlappende specificaties leveren eenvoudigweg overlappend lidmaatschap op.
De verleiding is om te gokken. Een formulier dat stilzwijgend het waarschijnlijkste land aanneemt, of het land van de browsertaal van de gebruiker, verzint informatie die de invoer niet bevatte. Een nationaliteit afleiden uit een reeks is zowel onbetrouwbaar als een categoriek andere activiteit dan het valideren van een formaat.
De eerlijke presentatie is een lijst. Toon elk schema waaraan de reeks voldoet, in een vaste volgorde, en laat de gebruiker — of het stroomafwaartse systeem met betere context — kiezen. Wanneer niets overeenkomt, meld dan een onbekend schema in plaats van een ongeldig nummer, want de tweede bewering kan de validator niet doen.
Lengte en tekenset zijn slechts een beginpunt
Beide controles zijn goedkoop, en beide worden vaak voor het hele karwei aangezien. Lengte alleen vangt weggevallen en herhaalde tekens; de tekenset alleen vangt het verkeerde alfabet. Geen van beide zegt iets over de relatie tussen de tekens.
Die relatie is precies wat een echt nationaal nummer heeft en een willekeurige reeks niet. Waar het register de relatie publiceert, kan een validator haar testen; waar het register haar privé houdt, haalt geen enkele mate van vernuft haar terug. Proberen een niet-gepubliceerde regel om te keren uit een steekproef van echte nummers is zowel onbetrouwbaar als een slecht gebruik van ieders tijd, want het resultaat is een gok die met het gezag van een specificatie wordt gepresenteerd.
Houd de lagen geordend en de meldingen specifiek. Een gebruiker wiens invoer op lengte faalde wil over lengte horen, en een wiens invoer alles behalve het afsluitende teken haalde wil over het afsluitende teken horen.
Voor ontwikkelaars: landregels behandelen als data
Het praktische gevolg van al die verscheidenheid is dat de regels niet moeten worden gecompileerd in het codepad dat de uitspraak bepaalt.
- Bewaar één record per schema: het land, de toegestane tekenset, de vorm en het dekkingsniveau — algoritme, alleen formaat, of geen.
- Bewaar de parameters voor schema’s die rekenkunde publiceren, en laat het veld leeg in plaats van te gokken voor de andere.
- Leid elke invoer langs de records waaraan hij voldoet en geef een lijst terug, geen enkele winnaar.
- Houd de vier uitspraken gescheiden in je types, zodat een aanroeper een formaat-only-resultaat niet per ongeluk als een goedkeuring behandelt.
- Dateer de regelset en maak het bijwerken ervan een datawijziging, want nationale conventies veranderen en een hardgecodeerde tabel wordt stil fout.
Waar een product identiteitswaarden uit meerdere landen verwerkt, verdient de privacyvraag dezelfde zorg als de rekenkunde. De gids over nationale ID-controlecijfers behandelt hoe deze schema’s zich tussen registers verhouden, en CPF CNPJ-validatie is een uitgewerkt voorbeeld van één land waarvan de twee belastingnummers verschillende interne regels volgen.
Volgende stappen
Som de landen op waarvan je product identiteitsnummers accepteert, en markeer elk als algoritme, alleen formaat of niet-gepubliceerd. Bevestig dan dat je interface voor elk van die drie gevallen iets anders zegt; de nummervalidatietool demonstreert de tekst voor elk dekkingsniveau, en het is de moeite waard na te gaan dat geen enkele melding een formaat-only-resultaat als een goedkeuring weergeeft.