Het Belgisch Rijksregister1 is een databank met gegevens over elke inwoner van België. De databank wordt beheerd door de Federale Overheidsdienst Binnenlandse Zaken2, maar de gegevens worden aangeleverd door de dienst Bevolking van de gemeenten. Kort na de geboorte krijgt elke inwoner een uniek rijksregisternummer3 waarmee een aantal administratieve gegevens in het Rijksregister terug te vinden zijn (domicilie, burgerlijke stand, nationaliteit). Dit nummer staat vermeld op de identiteitskaart en kan persoonlijk opgevraagd worden aan het loket van de dienst Bevolking.
Het rijksregisternummer bestaat uit 11 cijfers:
Een eerste groep van zes cijfers correspondeert met de geboortedatum in de volgorde jaar, maand en dag. Van het geboortejaar worden enkel de laatste twee cijfers gebruikt. De maand en de dag worden weergegeven met twee cijfers door eventueel een voorloopnul toe te voegen.
Een tweede groep van drie cijfers dient om onderscheid te maken tussen inwoners die op dezelfde dag geboren zijn. Het is een dagteller van de geboortes, waarbij voor vrouwen gebruikgemaakt wordt van even reeksnummers (002–998) en voor mannen van oneven reeksnummers (001–997).
Een derde groep van twee cijfers is een controlegetal dat berekend wordt op basis van het getal $$n$$ dat gevormd wordt door de negen voorafgaande cijfers. Voor inwoners die geboren zijn vanaf het jaar 2000 moet er nog een extra cijfer 2 voor de negen cijfers gezet worden (+ 2000000000) om het getal $$n$$ te vormen. De berekening bestaat er dan in om $$n$$ te delen door 97 (gehele deling) en de rest van die deling (modulo) af te trekken van 97. Dat verschil is het controlegetal. Het controlegetal wordt weergegeven met twee cijfers door eventueel een voorloopnul toe te voegen.
Op die manier weten we bijvoorbeeld dat het rijksregisternummer 93051822361 toegekend werd aan een man (oneven dagteller) die geboren is op 18 mei 1993 (eerste groep). We kunnen afleiden dat het geboortejaar 1993 is en niet 2093 (mochten we al zover zijn) omdat de deling van 930518223 door 97 rest 36 oplevert. We krijgen dan dat 97 - 36 gelijk is aan het controlegetal 61. Als de inwoner geboren was in 2093 dan zouden we voor de berekening van het controlegetal 2930518223 delen door 97 om rest 7 te bekomen. In dat geval had het controlecijfer 97 - 7 = 90 moeten zijn.
Schrijf een bash shell script rrn dat gebruikt kan worden om de geldigheid van een rijksregisternummer te controleren en om er informatie uit af te leiden. Het rijksregisternummer moet als eerste argument aan het shell script doorgegeven worden. Alle andere argumenten worden genegeerd. Als er geen argumenten doorgegeven worden dan is het gegeven rijksregisternummer gelijk aan de lege string.
Het shell script moet achtereenvolgens controleren of het rijksregisternummer aan de volgende voorwaarden voldoet:
Het rijksregisternummer moet exact 11 cijfers bevatten (alle karakters die geen cijfer zijn worden genegeerd). Als dat niet het geval is dan moet de volgende boodschap uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 1.
rrn: ongeldig formaat (n cijfers)
Hierbij is $$n$$ het aantal cijfers in het rijksregisternummer. Als $$n = 1$$ dan moet de boodschap de enkelvoudsvorm (1 cijfer) gebruiken.
Het getal dat gevormd wordt door de laatste twee cijfers van het rijksregisternummer moet gelijk zijn aan één van de twee mogelijke controlegetallen die berekend worden op basis van de eerste negen cijfers. Als dat niet het geval is dan moet de volgende boodschap uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 2.
rrn: ongeldig controlegetal
We gaan ervan uit dat rijksregisternummers waarvan de laatste twee cijfers gelijk zijn aan het berekende controlegetal voor inwoners geboren vanaf het jaar 2000 corresponderen met inwoners die geboren zijn in de 21ste eeuw (20xx) en de andere met inwoners die geboren zijn in de 20ste eeuw (19xx). Als het rijksregisternummer geen geldige geboortedatum bevat dan moet de volgende boodschap uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 3.
rrn: ongeldige geboortedatum
Als aan alle voorwaarden voldaan is dan moet het shell script de volgende informatie over het rijksregisternummer uitschrijven naar standaard uitvoer en eindigen met exit status 0.
rijksregisternummer: jj.mm.dd-xxx.cc
geslacht: geslacht
geboortedatum: dd/mm/jjjj
Hierbij moeten de cursieve fragmenten ingevuld worden met informatie die afgeleid wordt uit het gegeven rijksregisternummer:
De cijfers jj, mm en dd corresponderen met de geboortedatum (respectievelijk jaar, dag en maand), xxx met de dagteller en cc met het controlegetal zoals ze voorkomen in het rijksregisternummer.
De string geslacht correspondeert met het geslacht dat kan afgeleid worden uit de dagteller: man voor mannen en vrouw voor vrouwen.
De cijfers dd, mm en jjjj corresponderen met de geboortedatum (respectievelijk dag, maand en jaar), waarbij het jaartal volledig moet uitgeschreven worden (vier cijfers).
Onderstaande voorbeeldsessie geeft aan hoe het shell script rrn moet kunnen gebruikt worden.
$ rrn "75.12.05-137.14" rijksregisternummer: 75.12.05-137.14 geslacht: man geboortedatum: 05/12/1975 $ echo $? 0 $ rrn ">>>09082428248<<<LENA<NADINE<INGRID" rijksregisternummer: 09.08.24-282.48 geslacht: vrouw geboortedatum: 24/08/2009 $ echo $? 0 $ rrn 1234567890 rrn: ongeldig formaat (10 cijfers) $ echo $? 1 $ rrn xxx3xxx rrn: ongeldig formaat (1 cijfer) $ echo $? 1 $ rrn rrn: ongeldig formaat (0 cijfers) $ echo $? 1 $ rrn 85.02.01-002.00 rrn: ongeldig controlegetal $ echo $? 2 $ rrn 85.02.30-002.24 rrn: ongeldige geboortedatum $ echo $? 3
Omdat het rijksregisternummer enkel gebruikmaakt van de laatste twee cijfers van het geboortejaar, bestond de kans dat rijkregisternummers na het jaar 2000 niet langer uniek zouden zijn. Om deze manifestering van de milleniumbug4 (aka Y2K) het hoofd te bieden, werd op 25 november 1997 per koninklijk besluit vastgelegd dat vanaf de overgang naar het jaar 2000 bij de berekening van het controlegetal een extra cijfer 2 moest toegevoegd worden vóór de aaneenschakeling van de negen cijfers van de geboortedatum en de dagteller.
Over een paar decennia dreigt een gelijkaardige crisis met de social security numbers5 die in de Verenigde Staten gebruikt worden om inwoners te identificeren. Ook die identificatienummers zijn uniek en worden nooit gerecycleerd als iemand sterft. Er zijn ongeveer één miljard verschillende identificatienummers en sinds 1936 werd daarvan ongeveer al één derde toegekend. Volgens sommige schattingen zouden de beschikbare identificatienummers tegen 2075 allemaal opgebruikt zijn.
Wat zal er dan gebeuren? Wie zal het zeggen? Maar als de regering daardoor valt dan kunnen de Amerikanen altijd nog naar Zuid-Amerika trekken: daar geven de nationale identificatienummers toegang tot online videogames.