p.f.t.
Niels
>Er der en, som kan hjaelpe med en stump program (gerne pascal, c++) til
>at checke at cpr-numre er korrekte
>
Der skal såmen ikke meget til, da alle personnumre er lavet med modulo
11 reglen, så skal de blot checkes med modulo 11 reglen.
Da enhver med kendskab til modulo 11 reglen kan lave et gyldigt
cpr-nr. er et check vel ikke så meget værd ? Ok, der er nogle
faldgruber hen ad vejen, men dem kan man jo have kendskab til.
Bla.a. holdt man i midten af 70'erne op med at bruge løbenr. under
1000 og så sparer man vist løbenr. fra 5000-9999 til personer født i
forige århundrede.
(Jeg tror også invandrere får tildelt løbenr. i den første del af
serien 1000-4999 for hver fødselsdag der beregnes cprnr. til)
Dengang en hjemmekomputer kun kunne programmeres i basic (de gode af
dem), var der også meget skæg med basicprogrammer til generering af
cpr-nr.
På bare 1 fødselsdag, kom der hundredevis af godkendte cpr-nr.(eller
godt 350 stk.)
Modulo 11 reglen er 4327654321, hvor 4 ganges med 1 ciffer
3 - - 2 -
2 - - 3 -
7 - - 4 -
.
.
.
1 - - 10 -
Alle produkterne lægges sammen og checkes om summen kan divideres med
11 uden der bliver rest.
Så check af cprnr. kan altså ske med en lommeregner med de 4
regnearter +, -, * og /.
Generering af gyldige cprnr. sker bedst i en komputer, da der skal
checkes for alt muligt inden 1 af de mulige 350 cprnr. kan "bruges".
--
\/
___m_oo_m___
Gerner.
http://inet.uni-c.dk/~gerner1
The worlds most boring web page.
NO hyper/super links to nowhere.
Efter hvad jeg har hørt, er formålet først og fremmest at opdage,
når de kommunale skrankedamer og -herrer taster forkert.
Modulo 11 reglen har i den forbindelse den fordel, at fejl,
der begrænser sig til et enkelt ciffer, altid vil blive opdaget.
Min kilde er et nummer af Illustreret Videnskab, jeg læste engang.
Vistnok for 5-10 år siden. Deri kan Niels Graverholt finde en udmærket
beskrivelse af, hvordan man genererer og tjekker cpr-numre - dog
uden tilhørende Pascal eller C++ kode.
-- Jens Steiner
Det har jeg, men jeg har koden derhjemme. Poster det imorgen.
Den følgende funktion returnerer true hvis cpr nummeret er korrekt:
Boolean ValidationFilter :: validateCPR( const IString& string )
{
IString str( string );
long lFactors[11] = { 4, 3, 2, 7, 6, 5, 0, 4, 3, 2, 1 };
long lSum(0);
str[7] = '0'; // fjerner lige bindestregen
if ( str.isDigits() ) { // så dette skulle blive sandt
for ( long lIndex = 0; lIndex < 11; lIndex++ )
lSum += (str[ lIndex + 1 ] - '0') * lFactors[ lIndex ];
}
return ( lSum % 11 ) ? false : true;
}
Der er lige en detalje ved cpr numre som ikke alle ved:
De to midterste tegn i de fire sidste tegn i cpr nummeret KAN være bogstaver,
det er noget med udlændinge og nyfødte der endnu ikke har fået et rigtigt
cpr nummer. Eks. 070568-2ab1, om der er nogen regler for dette ved jeg ikke!
Håber det kan bruges.