Henkilötunnus

raspi 22.05.02 01:36

Tällä voi tarkastaa henkilötunnuksen oikeellisuuden

 Tekstiversio  Arvo: 1 (12 ääntä)  Äänestä: +  -
<?php
function tarkista_henkilotunnus ($hetu) {
  if (strlen($hetu) == 11) {
    $paiva = (int) substr($hetu, 0, 2); // PP
    $kuukausi = substr($hetu, 2, 2); // KK
    $vuosi = substr($hetu, 4, 2); // VV
    $vsata = substr($hetu, 6, 1); // C
    $ynro = substr($hetu, 7, 3); // NNN
    $tark = substr($hetu, 10, 1); // X
    if (($kuukausi >= 1 || $kuukausi <= 12) && ($ynro > 002 || $ynro < 999)) {
      $vuosisata = array (
        '+' => "1800",
        '-' => "1900",
        'A' => "2000"
      );
      if (isset($vuosisata[$vsata]) && $vuosisata[$vsata]) {
        $tarkistusmerkit = array (
          0 => 0, 1 => 1, 2 => 2, 3 => 3,
          4 => 4, 5 => 5, 6 => 6, 7 => 7,
          8 => 8, 9 => 9, 10 => A, 11 => B,
          12 => C, 13 => D, 14 => E, 15 => F,
          16 => H, 17 => J, 18 => K, 19 => L,
          20 => M, 21 => N, 22 => P, 23 => R,
          24 => S, 25 => T, 26 => U, 27 => V,
          28 => W, 29 => X, 30 => Y
        );
        $tarkista = ($paiva . $kuukausi . $vuosi . $ynro) % 31;
        if (isset($tarkistusmerkit[$tarkista]) && $tarkistusmerkit[$tarkista] == $tark) {return 1;} else {return 0;}
      } else {return 0;}
    } else {return 0;}
  } else {return 0;}
}


$htun = "010101-0101";
echo "Henkilötunnus: <b>$htun</b> == ";
if (tarkista_henkilotunnus($htun)) {echo "OK";} else {echo "VÄÄRÄ";}
echo "<br>\n";
?>

Akiro 13:24 30.8.02 
toinen versio samasta asiasta, tosin sisennykset ei taida toimia tässä kommentti-kentässä, mutta kai tosta selvän saa:

function chk_henktun($tunnus) {
$merkit = array(0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y");
if(eregi("^([0-9]{6})-([0-9]{3})([0-9a-z]{1})$",$tunnus,$regs)) {
if($merkit[intval($regs[1].$regs[2])%31] == strtoupper($signum[strlen($tunnus)-1])) { return true; }
} else return false;
}
pllk 12:14 16.4.03 
Esimerkkinä hyvä, mutta aika paljon tuota voisi tiivistääkin, kuten Akiro sanoi. Kuinkahan moni tarvitsee oikeasti henkilötunnuksen tarkistusta ohjelmassaan? ;-)

function tarkistahetu($t) {
$k = "0123456789ABCDEFHJKLMNPRSTUVWXY";
return substr($k,intval(substr($t,0,6).substr($t,7,3))%31,1)==substr($t,-1);
}
lerppukorppucd 15:09 27.9.03 
Tosi hyvä 5+ arvonen!
lerppukorppucd 15:11 27.9.03 
Oonki miettiny mikä on nyt 2000 ja 1800-luvulla ne välimerkit
Drex 18:09 7.2.04 
:) Hyvä.
Tombio 12:22 25.8.04 
$tarkistusmerkit-taulukkoon syötetään alkioihin vakioita, joita ei missään esitellä... Muuten kyllä pelaa kivasti.
S-E Davidsson 12:33 4.10.04 
Been searching for the past day for a way to validate finnish "henkilötunnu".

A friend pointed me to this site&page, but now I'm confronted with another issue, I thought finnish numbers were almost like the swedish (10 chars) YYMMDD-XXXX, but with DDMMYY-123A, this script above wants 11 chars instead of ten, can someone help me out? :)
editoitu: 12:04 29.10.04
empty 12:04 29.10.04 
... like the swedish (10 chars) YYMMDD-XXXX, but with DDMMYY-123A, this script above wants 11 chars instead of ten...

In finnish social security numbers the delimiter (the slash in your example) denotes the century-of-birth for the person, hence the eleven char requirement. (Sorry for my horrible English :P)

Kiva script, muuten.
pi 10:14 8.10.05 
Kannattaa vielä tarkistaa on ko kyseistä päivää edes ollutkaan...

bool checkdate ( int month, int day, int year )
ares01 13:24 29.10.05 
oh fuck its cool