Diskusjon:Fødselsnummer

Fra Wikipedia, den frie encyklopedi
Hopp til navigering Hopp til søk

Fødselsnummer har man vel kun i Norge? --–Duffman 28. jul 2005 kl.20:01 (UTC)

Man har også fødselsnummer i Sverige og Danmark, dog med en litt annen oppbygning og annet navn. Jeg vil også anta at det er flere land som har tilsvarende. Så en liten generell beskrivelse først er nok på sin plass før man utgreier videre om norske fødselsnummer. –Wintermute 28. jul 2005 kl.21:21 (UTC)
Jeg tror faktisk Norge er det eneste landet med fødselsnummer. Sverige har personnummer, Danmark har CPR-nummer. --–Duffman 28. jul 2005 kl.21:45 (UTC)
Sverige har fødselsnummer, med firesifret personnummer i tillegg til fødselsdatoen. Det er også planer om å standardisere unike ID-nummer for innbyggere i EU og EØS, og de vil være bygget opp med fødselsdato som første del. Cnyborg 28. jul 2005 kl.21:57 (UTC)
I Sverige heter det sv:Personnummer, i Danmark da:CPR-nummer. Fødselsnummer er visst unikt for Norge, selv om det kan sammenlignes med både det svenske personnummeret, det danske CPR-nummeret, det amerikanske Social Security-nummeret, det australske Tax File-nummeret osv. --–Duffman 28. jul 2005 kl.22:08 (UTC)
I et møte jeg var i med Skattedirektoratet for en tid siden brukte de konsekvent både muntlig og skriftlig betegnelsen fødselsnummer på alle slike unike ID-numre som har fødselsdato som ett av leddene. Slik sett vil jeg si at det er parallelt med at vi omtaler andre ordninger under norsk navn selv om det heter noe annet (som f.eks. alderspensjon som vi var innom, det heter også forskjellige ting, men grunnprinsippet er det samme. Jeg mener de bør behandles i samme artikkel under tittelen fødselsnummer, evt. med en henvisning til hva det heter på det enkelte språk. Cnyborg 28. jul 2005 kl.22:12 (UTC)

Da vil jeg mene at personnummer er en bedre betegnelse på slike numre (ja, jeg er klar over at personnummeret kun er en del av det norske fødselsnummeret); det er mer brukt i dagligtale, det er en mer direkte oversettelse av personal identification number, og det favner også ID-numre som ikke er basert på fødselsdato. --–Duffman 28. jul 2005 kl.22:16 (UTC)

Jeg ser logikken i det. En løsning kan kanskje være å la fødselsnummer omhandle kun Norge, mens alt annet legges under personnummer, og så en gjensidig henvisning først i artiklene? Cnyborg 28. jul 2005 kl.22:27 (UTC)
Perfekt. --–Duffman 28. jul 2005 kl.22:29 (UTC)
Man har også tilsvarende i Ísland, som heter der «kennitala»: fødselsdatoen+firesiffet tilleg. Den ha også firma og bank. Fingalo 10. mai 2007 kl. 15:47 (CEST)

Kildekode for å sjekke fødselsnummer[rediger kilde]

Har hatt bruk får å sjekke gyldigheten til fødselsnummer i et stykke programvare. Tok utgangspunkt i Wikipedia-artikkelen og skrev en liten snutt i Ruby for dette. Det kan jo være fint å definere fødselsnummeret i et formelt språk i tillegg til den mer "muntlige" beskrivelsen som allerede er i artikkelen. Hvis det er feil i skriptet under, og noen retter det er det jo fin tilbakemelding til meg også. Eielsen

#!/usr/bin/env ruby -w

require "Date"

def valid?(pin)
  raise "Inndata må være en tekststreng." if pin.class != String
  begin
    Integer(pin)
  rescue
    raise "Inndata kan ikke forstås som et nummer."
  end

  raise "Feil lengde." unless pin.length == 11
  
  dd = pin[0..1].to_i; mm = pin[2..3].to_i; yy = pin[4..5].to_i; type = "F"
  unless dd.between?(01,31) and mm.between?(01,12) and yy.between?(00,99)
    if dd.between?(41,71)
      type = "D"
      dd -= 40
    elsif mm.between?(41,52)
      type = "H"
      mm -= 40
    else
      raise "Ugylding fødselsdato."
    end
  end
  
  id = pin[6..8].to_i
  if id.between?(000,499)
    yyyy = 1900 + yy 
  elsif id.between?(500,749) and yy.between?(55,99)
    yyyy = 1800 + yy
  elsif id.between?(500,999) and yy.between?(00,39)
    yyyy = 2000 + yy
  elsif id.between?(900,999) and yy.between?(40,99)
    yyyy = 1900 + yy
  else
    raise "Individsifre og fødselsdato stemmer ikke overens."
  end
  
  begin
    birthdate = Date.new(yyyy,mm,dd)
  rescue ArgumentError
    raise "Ugylding fødselsdato." # eksisterer ikke i den gregorianske kalender
  end
  
  pin = pin.split('').map { |c| c.to_i }
  
  k, ch = 0, [3, 7, 6, 1, 8, 9, 4, 5, 2]
  pin[0..8].each_index do |i|
    k += pin[i]*ch[i]
  end
  k1 = k.modulo(11) == 0 ? 0 : 11 - k.modulo(11)
  
  k, ch = 0, [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
  pin[0..9].each_index do |i|
    k += pin[i]*ch[i]
  end
  k2 = k.modulo(11) == 0 ? 0 : 11 - k.modulo(11)
  
  unless k1 == pin[9] and k2 == pin[10] or (k1 == 10 or k2 == 10)
    raise "Ugyldig sjekksum."
  end
  
  gender = pin[8].modulo(2) == 0 ? "kvinne" : "mann" # kvinne - partall | mann - oddetall
  
  return birthdate, gender, type
end

# Start...
print "Fødselsnummer: "
pin = gets # PIN (personal identification number -> fødselsnummer)
pin.strip!
print "Tester #{pin}...\n"

begin
  birthdate, gender, type = valid?(pin)
  print "fødselsdato: #{birthdate}, kjønn: #{gender}, type: #{type}\n"
rescue => errMsg
  puts errMsg
end
Fint å ha eit kodeeksempel på dette. Eg kan ikkje Ruby, men ser litt småplukk. Koden fangar ikkje opp ugyldige datoar av typen "31. februar" og datoar av typen "1. juni 2012" som er gyldige men som umogleg kan ha blitt tildelt enno. Vil nok vere mest gunstig å bruke ein innebygd datofunksjon i Ruby til å sjekke dette istadenfor å bruke between. Korleis vil between forresten oppføre seg viss innputt inneheld bokstavar? Bevegelsesmengde 25. sep 2007 kl. 13:22 (CEST)
Det vore intressant att skriva om den i Excel Visual Basic. Då kan många fler ha nytta av den, för fler har Excel än en Ruby interpreter. Man kunde ladda upp en Excel fil.-- BIL 25. sep 2007 kl. 22:24 (CEST)
Da har jeg oppdatert scriptet til å fange opp det jeg kan komme på av feilsituasjoner. Eielsen

Eksempel i javascript[rediger kilde]

Her er en javascript-snutt jeg snekra sammen nå.. --Stigmj 13. okt 2007 kl. 18:56 (CEST)

function sjekkpnum() {
	//Hent input'en
	pnumstreng = document.forms['pnumform'].elements['pnum'].value;
	//alert(pnumstreng);

	// Sjekk at personnummeret har riktig lengde
	if (pnumstreng.length != 11) { 
		document.writeln("Feil! Personnummeret må være eksakt 11 siffer");
		return;
	}
	// Finn de forskjellige delene
	dag = pnumstreng.substr(0,2);
	mnd = pnumstreng.substr(2,2);
	aar = pnumstreng.substr(4,2);
	ind = pnumstreng.substr(6,3);
	k1 = pnumstreng.substr(9,1);
	k2 = pnumstreng.substr(10,1);
	if ( ind.substr(2,1) % 2 == 0) {
		document.write("Dette er en kvinne");
	} else {
		document.write("Dette er en mann");
	}
	aarstall = parseInt(aar);
	if ( ind > 0 && ind < 500) {
		aarstall += 1900;
	} else 	if ( ind > 499 && ind < 750 && aar > 55 && aar < 100) {
		aarstall += 1800;
	} else if ( ind > 499 && ind < 999 && aar >= 00 && aar < 40) {
		aarstall += 2000;
	} else if ( ind > 899 && ind < 999 && aar > 39 && aar < 100) {
		aarstall += 1900;
	} else {
		document.writeln(", FEIL: individsifre og fødselsdato stemmer ikke overens!");
		return;
	}
	document.write(" som er født i årstallet " + aarstall);
	d1 = parseInt(dag.substr(0,1));
	d2 = parseInt(dag.substr(1,1));
	m1 = parseInt(mnd.substr(0,1));
	m2 = parseInt(mnd.substr(1,1));
	a1 = parseInt(aar.substr(0,1));
	a2 = parseInt(aar.substr(1,1));
	i1 = parseInt(ind.substr(0,1));
	i2 = parseInt(ind.substr(1,1));
	i3 = parseInt(ind.substr(2,1));
	// Regn ut k1
	k1utregnet = 11 - (((3*d1) + (7*d2) + (6*m1) + m2 + (8*a1) + (9*a2) + (4*i1) + (5*i2) + (2*i3)) % 11);
	if (k1utregnet==11) k1utregnet = 0;
	if (k1utregnet == 10) {
		document.writeln(", FEIL: kontroll-siffer 1 kan aldri bli 10");
		return;
	}
	if (k1 != k1utregnet) {
		document.writeln(", FEIL: kontroll-siffer 1 er feil!");
		return;
	}
	// Regn ut k2
	k2utregnet = 11 - (((5*d1) + (4*d2) + (3*m1) + (2*m2) + (7*a1) + (6*a2) + (5*i1) + (4*i2) + (3*i3) + (2*k1utregnet)) % 11);
	if (k2utregnet==11) k2utregnet = 0;
	if (k2utregnet == 10) {
		document.writeln(", FEIL: kontroll-siffer 2 kan aldri bli 10");
		return;
	}
	if (k2 != k2utregnet) {
		document.writeln(", FEIL: kontroll-siffer 2 er feil!");
		return;
	}
	document.writeln(" og har passert alle tester");
}

Den er basert på å benytte denne html-siden:

 <html>
 <head>
 <title>Sjekk av personnummer</title>
 <script type="text/javascript">
 <!-- 

  her skal da det scriptet inn..

 -->
 </script>
 </head>
 <body>
   <form name="pnumform" action="javascript:sjekkpnum();">
     <input type="text" name="pnum" size="11" value=""></input>
     <input type="button" name="submit" value="Submit" onClick="javascript:sjekkpnum();"></input>
   </form>
 </body>

Script for å generere et vilkårlig fødselsnummer[rediger kilde]

Her er et script for å generere et et vilkårlig fødselsnummer. Greit å ha for å fylle f.eks. en databasetabell med testdata etter at man har lagt inn validering på et felt for fødselsnummer. Eielsen

#!/usr/bin/env ruby -w

require "Date"

begin
  #date = Date.today
  date = Date.new(rand(2039 - 1855 + 1) + 1855, rand(12) + 1, rand(30) + 1) # rand(a) gir et heltall i intervallet [0,a)
rescue ArgumentError
  raise "Ugylding fødselsdato." # eksisterer ikke i den gregorianske kalender
end
d, m, y = date.day, date.month, date.year

pins = Hash.new
pins["male"] = []
pins["female"] =[]

if y.between?(1900,1999)
  y -= 1900
  from_id = "000"
  to_id   = "499"
  if y.between?(1940,1999) and rand(2) == 0
    from_id = "900"
    to_id   = "999"
  end
elsif y.between?(1855,1899)
  y -= 1800
  from_id = "500"
  to_id   = "749"
elsif y.between?(2000,2039)
  y -= 2000
  from_id = "500"
  to_id   = "999"
else
  raise "Kan ikke generere fødselsenummer for gitt år."
end

dd = d < 10 ? "0" + d.to_s : d.to_s
mm = m < 10 ? "0" + m.to_s : m.to_s
yy = y < 10 ? "0" + y.to_s : y.to_s
bday = (dd + mm + yy).split('').map { |c| c.to_i }

id = from_id
until id == to_id
  sex = id[2].to_i.modulo(2) == 0 ? "female" : "male"
  
  pin = bday + id.split('').map { |c| c.to_i }
  
  k, ch = 0, [3, 7, 6, 1, 8, 9, 4, 5, 2]
  pin.each_index do |i|
    k += pin[i]*ch[i]
  end
  k1 = k.modulo(11) == 0 ? 0 : 11 - k.modulo(11)
      
  unless k1 == 10   
    pin << k1
    k, ch = 0, [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
    pin.each_index do |i|
      k += pin[i]*ch[i]
    end
    k2 = k.modulo(11) == 0 ? 0 : 11 - k.modulo(11)
    
    unless k2 == 10
      pin << k2
      pins[sex] << pin.join
    end
  end
  
  id.succ! # f.eks. "000", "001", "002" ...
end

puts date
print "Fødselsnummer, mann: "
puts pins["male"][rand(pins["male"].length)]
print "Fødselsnummer, kvinne: "
puts pins["female"][rand(pins["female"].length)]

Feil i lenke[rediger kilde]

Linken "Les mer på matematikk.org" fungerer ikke lenger.

Riktig lenke er: http://www.matematikk.org/_videregaende/side/vis.html?tid=64294

Modulo[rediger kilde]

Denne delen bør justeres:

....er første kontrollsiffer:

k1 = 11 - ((3 × d1 + 7 × d2 + 6 × m1 + 1 × m2 + 8 × å1 + 9 × å2 + 4 × i1 + 5 × i2 + 2 × i3) mod 11), der mod er modulusfunksjonen. Tilsvarende er det andre kontrollsifferet:

k2 = 11 - ((5 × d1 + 4 × d2 + 3 × m1 + 2 × m2 + 7 × å1 + 6 × å2 + 5 × i1 + 4 × i2 + 3 × i3 + 2 × k1) mod 11). I prinsippet kan formlene for kontrollsifrene gi 10 som kontrollsiffer, men slike nummer faller utenfor definisjonen av fødsels- og personnummer på 11 siffer.

Romanian interwiki[rediger kilde]

Please remove the Romanian interwiki from this article, it's wrong (see here for confirmation). Thank you! --Gutza 16. nov 2008 kl. 00:47 (CET)

It's removed. (also unprotected the article) Laaknor 16. nov 2008 kl. 01:57 (CET)


Andre Land[rediger kilde]

Også i Tyskland har man et nummer som gjelder hele livet: pensjon forsikrings nummer. Tidligere fikk man det når man for første gang hadde en sosialforsikringspliktig jobb, siden 2005 får man nummeret faktisk ved fødselen. 81.167.188.201 3. mai 2010 kl. 00:31 (CEST)

Globalt perspektiv?[rediger kilde]

Artikkelen lenker til ID på andre språk. De fleste av disse lenker igjen til nye land. Dersom en mener at "Fødselsnummer" er et nasjonalt nr i Norge, så bør tilsvarende de fleste iw fjernes? KjellG 11. nov 2011 kl. 18:57 (CET)

Enig. Denne artikkelen har da også nok materiale til å kunne forsvare å omhandle det norske fødselsnummeret – så løsningen blir å opprette en ny artikkel om nasjonale personnumre mer generelt? Personnummer? Eller bør det heller være en pekerside, og Nasjonalt personnummer være den generelle? — the Sidhekin (d) 11. nov 2011 kl. 21:30 (CET)

Endret eksterne lenker[rediger kilde]

Jeg har nettopp endret 2 ekstern(e) lenke(r) i artikkelen Fødselsnummer. Sjekk gjerne at endringen min er OK. Hvis du ønsker at jeg skal ignorere disse lenkene eller hele siden, eller hvis du har andre spørsmål, se denne spørsmålssiden. Jeg har gjort følgende endringer:


Med hilsen—InternetArchiveBot (Rapporter feil) 29. jul. 2017 kl. 23:11 (CEST)

Endret eksterne lenker[rediger kilde]

Jeg har nettopp endret 1 ekstern(e) lenke(r) i artikkelen Fødselsnummer. Sjekk gjerne at endringen min er OK. Hvis du ønsker at jeg skal ignorere disse lenkene eller hele siden, eller hvis du har andre spørsmål, se denne spørsmålssiden. Jeg har gjort følgende endringer:


Med hilsen—InternetArchiveBot (Rapporter feil) 4. sep. 2018 kl. 05:42 (CEST)