PESEL - wszystko, co o nim możesz wiedzieć

Twardy

Jak wiemy, PESEL to numer identyfikacyjny każdego z nas, który widnieje w dowodzie osobistym. Większość z nas wie o tym, co z niego można wyciągnąć. Wiemy na pewno (większość z nas), że pierwsze cyfry to data urodzenia właściciela numeru identyfikacyjnego (PESEL), która wygląda tak, że pierwsze dwie cyfry to rok, dwie następne to miesiąc, zaś dwie kolejne to dzień. Np. 771001 będzie znaczyło, że osoba urodziła się 1977 roku, 1 października.
Teraz przejdźmy do czegoś ciekawszego. Z numeru identyfikacyjnego możemy dowiedzieć się o płci osoby, jaką reprezentuje PESEL. Wystarczy spojrzeć na przedostatnią cyfrę, jeśli jest parzysta - kobieta; nieparzysta - mężczyzna.
I tak dla przykładu zbadajmy taki PESEL: 49040501580. Przedostatnia cyfra (parzysta) oznacza, że jest to kobieta urodzona 5 kwietnia, 1949 roku (pięćdziesiątka na karku). I to by mogło być na tyle, ale jak sprawdzić czy w ogóle dany PESEL jest oryginalny? Wystarczy znać pewien algorytm, który poprzez odpowiednie kalkulowanie cyfr numeru identyfikacyjnego musi odpowiadać cyfrze kontrolnej, jaką jest ostatni znak PESELA (na przykładzie to 0). Dokładnie polega to na tym, że każdą cyfrę numeru identyfikacyjnego od pierwszej do przedostatniej (ostatnia to wspomniana suma kontrolna) musi być przemnożona przez odpowiednią cyfrę, która wchodzi w skład odpowiedniej tablicy dziesięciocyfrowej, której cyfry nazywamy wagi. Po pomnożeniu następuje sumowanie tych cyfr i wynik należy podzielić modulo przez 10, z kolei rezultat trzeba zróżnicować z 10 a wynik musi zgadzać się z ostatnią cyfrą.

Przykład:

Naszym numerem identyfikacyjnym niech będzie już wspomniany ciąg: 49040501580.
Wspomniane wagi to cyfry reprezentujące tablicę, które wyglądają tak: 1, 3, 7, 9, 1, 3, 7, 9, 1, 3

1. Teraz każdą cyfrę PESELA (prócz ostatniej) mnożymy zgodnie z cyfrą wagi:

PESEL: 4 9 0 4 0 5 0 1 5 8 0 <== suma kontrolna, którą na tym etapie nie bierzemy pod uwagę;
WAGI: 1 3 7 9 1 3 7 9 1 3

WYNIK: 4x1=4 ;9x3=27 ;0x7=0 ;4x9=36 ;0x1=0 ;5x3=15 ;0x7=0 ;1x9=9 ;5x1=5 ;8x3=24

2. Teraz wyniki sumujemy: 4 + 27 + 0 + 36 + 0 + 15 + 0 + 9 + 5 + 24 = 120;

3. Następnie dzielimy module przez 10: 120 mod 10 = 0

4. 10 odejmujemy od wyniku: 10 - 0 = 0;

5. Wynik porównujemy z sumą kontrolną: 0 = 0.

//Mała korekta:
W tym przypadku 10-0 nie jest 0 tylko 10. Ale patrzymy na ostatnią cyfrę tej liczby. Chociaż jak sprawdzałem na oryginalnych PESELACH to najczęściej wynikiem była liczba jedno cyfrowa

I to by było na tyle. Już niedługo opowiem o numerze: REGON i NIP.

19 komentarzy

http://chemeng.p.lodz.pl/zylla/ut/pesel.html
Dobre i przydatne to jest to w powyższym linku. Na samym dole mamy więcej informacji, min o NIP REGON, etc

dobrym sposobem jest tez sprawdzanie daty, i jeśli ktoś ma ujemną liczbę lat czy dni życia (zależy jak ktoś chce to policzyć) to pesel uznawany za błędny.

Artykuł trzeba przyznać niczego sobie ale i tak większość skryptów w PHP nie jest odporna na błędny PESEL jakim jest np: 44444444444 - Ma prawidłową cyfrę kontrolną, ale chyba nie ma 44 dnia w żadnym miesiącu.

Osobiście to polecam stronę http://pesel.php64.pl - Wszystko i na temat numeru PESEL
Po przeczytaniu strony nie można tego już nie rozumieć. Na prawdę kawał dobrej roboty.

Pozdrawiam

Artykuł niezły, ale mam takie uwagi:

  • Algorytm sprawdzający MUSI uwzględniać datę urodzenia. Dzięki temu unikasz błędu "44"
  • Algorytm POWINIEN sprawdzać płeć
    Popularne błędy:
  • Data urodzenia nie taka jak w numerze
  • zła suma kontrolna
  • data poza zasięgiem np. 31 listopada
  • płeć inna niż w numerze
  • powtórzenie numeru

Już to widziałem na innej stronie. Moim zdaniem lepiej tam było to opisane!!! Dryobates : 2002-07-14. A taki??? 9987141234x. Do tego wystarczy Wagi odjąć od dziesięciu i zamienić na 9 7 3 1 9 7 3 1 9 7 i pomijany jest problem 10-0=0, bo nie trzeba odejmować wyniku od dziesięciu. mam nadzieję, że jasno piszę, podane informacje poznałem na stronce, której adresu nie pamiętam :(

Chciałbym także, zwrócić uwagę wszystkich na problem jedenastu identycznych cyfr. PESEL o liczbie 11111111111 jest nieprawidlowy, bo nie spełnia sumy kontrolnej ale PESEL o liczbie 22222222222 już ją spełnia. Tak naprawdę to każdy PESEL złożony z z samych 2, 4 , 6 i 8 jest poprawny według obliczeń, a tylko 22222222222 może wogóle wystąpić w realnym świecie ( osoba która urodzi sie 2-go lutego 2022 roku płci żeńskiej ma szansę na spełnienie wszystkich wymogów na otrzymanie takiego PESEL-u ). Faktem jest iż szanse na taki nr są mniejsze niż wygranie w dużego lotka, niemniej jednak pisząc dobre programy nie pozawlające na poprłnianie błędów powinno się dorobić warunek sprawdający czy PESEL nie jest złożony np z samych 6. Tak na marginesie jeśli chodzi o NIP, który na łamach tej witryny też był opisywany, także posiada ten błąd. Możliwe jest stworzenie poprawnego nr NIP złożonego z samych 1, 2, 3, itd. a w rzeczywistości taki numer nie może zostać wystawiony.
Pozdrawiam dfa51

Ano po to, że wynik dzielenia modulo nie zawsze musi być równy zero. W tym wypadku odejmowanie nic nie zmienia, ale co, jeśli potraktujemy liczbę np. 121 mod 10? Wychodzi 1, a to już robi pewną różnicę.

"4. 10 odejmujemy od wyniku: 10 - 0 = 0;"
A po co to?

Wow, bardzo ciekawy art... nie spodziewałam się że znajdę tu coś takiego :P...

Przykład do artykułu: [url]http://4programmers.net/view_file.php?id=1499[/url]. Moja robotka :D, ale kod nieskomentowany :D.

Myslalem, ze jezeli pokaze tylko przepis na algorytm to nie sprawi to zadnego problemu. Ale jezeli bylo by wiecej chetnych moglbym napisac kod zrodlowy z wynikowym dla PESELA. Nawet sprawdzajacy poprawnosc w przypadku takim jak zadal pytanie Dryobates. Ale wydaje mi sie, ze nie jest to problem stworzyc taki algorytm?

Przykładowy kod w Delphi:

function Is_numeric(s:string):boolean;
var i:Integer;
begin
 result:=false;
 for i:=1 to length(s) do
  if s[i] in ['0'..'9'] then result:=true else begin
   result:=false;
   break;
  end;
end;

const tab:array [1..10] of byte = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
var s:string;
    res,x:integer;
    code:integer;
    b:byte;
begin
 writeln('Podaj PESEL:');
 readln(s);
 if (length(S)<>11) or (not Is_numeric(s)) then begin
  WriteLn('Błąd składni numeru identyfikacyjnego');
  readln;
  exit;
 end;
 res:=0;
 For x:=1 to 10 do begin
  val(s[x],B,code);
  res:=res+ B * Tab[x];
 end;
 val(s[11],B,code);
 res:=10 - res mod 10;
 If res=10 then res:=0;
 if res=B then writeln('OK') else writeln('false');
 readln;
end.

SCIAGNIJ - jest to generator peseli autorstwa Jedi. Moze sie przyda ...... ;]

// trza wziac prawym i Zapisz element docelowy....

Z tego co widzę, to nie ma takiego pliku pod linikiem....

10-0 = 0 :> dobrze ze korekta jest

teraz niech ktoś napisze progsa który wczytuje wszystkie dane z peselu i poda linka :)

A taki numer to jaka data urodzenia? :> 02271412344
Jakbys uznal, ze to bledny numer i nie wiedzial jak to rozszyfrowac to rozwiazanie jest tutaj:
Opis PESEL na stronach MSWiA

dobre i przydatne

Tak w ramach ścisłości to ten kod "Twardy" jest raczej napisany w Pascalu...