Artykuły na każdy temat

PESEL - rozkmina

Dodano 12.02.2012r. o 21:48
Dla osób niezorientowanych się w temacie PESEL-u polecam na początku opis na wiki oraz dokładniejszy na tej stronie.

Odnosząc się do ostatniego wpisu towarzysza Sobaka zostałem zainspirowany kwestią PESEL-u. Po pierwsze doszedłem do wniosku, że prawie wszystkie skrypty czy źródła programów są błędne. Nawet znaleziony jakiś algorytm w sieci zawiera błąd, bo nie uwzględnia wszystkich dni przestępnych, przez co wyszedł mi za pierwszym razem zły wynik przy generowaniu pełnej bazy danych PESEL-i. Takie są właśnie efekty bezmózgiego kopiowania. Z tego co pamiętam to w pierwszym podejściu wygenerowało 1825000000 możliwych kombinacji uwzględniając poprawność dat urodzenia. Dobrze, że Guliwer szybko wyprowadził mnie z błędu, dlatego serdecznie mu za to dziękuję. Ogólnie bardzo nieoptymalnie napisane są te wszystkie oprogramowania. Ma to też swoje dobre strony, bo można bazować na czyimś (nie)doświadczeniu i zbudować coś lepszego. Ogólnie najpierw poprawiłem, zoptymalizowałem i przepisałem czyjś kod strukturalny na OOP w PHP i dałem do oceny na FW, a następnie bazując na tym kodzie napisałem wersje C#, z której wygenerowałem pełną bazę danych.

Zakładając, że nie popełniłem innego błędu to liczba 1826210000 jest prawdziwą ilością kombinacji numerów PESEL uwzględniając prawidłowe daty. Z początku chciałem wygenerować to w PHP jednak szybko doszedłem do wniosku, że jest niewydajne. Z tego powodu zacząłem pisać projekt w C jednak również okazało się, że jest niedostatecznie wydajnie. W związku z tym napisałem aplikacje w C# i po raz kolejny doceniłem moc tego języka. W ogóle jaka śmieszna rzecz wynikła z całej tej zabawy. Na Sobaka komputerze program działał dwa razy wolniej niż u mnie mimo, że mam procesor AMD Smile Cała ta technologia Turbo Boost u Sobaka zdała się na nic. Podczas drugiego podejścia program działał bez przerwy od 23:26 do 15:14 następnego dnia. Szkoda, że dopiero potem (po wygenerowaniu 75% wyników) wpadłem na genialny pomysł optymalizacji. Ostatnią cyfrą PESEL'u jest suma kontrolna, czyli w przypadku, kiedy jest nią np. 0 to można spokojnie dodać 10 do głównego wskaźnika pętli. Jeżeli mnie myślenie nie zwodzi to tak to powinno wyglądać:
Kod:
<?php
// ciach
for($h 10100000$h <= 13199999++$h)
{
 if($pesel -> is_valid(fill_with_zeros($h11)) === true)
 {
  $h += $pesel -> pesel[10];
  ++$trafione_zatopione;
 }
}
// ciach
?>
Za pierwszym razem bez zaznaczonego drugiego zapisu ta pętla generuję się średnio 40 sekund, a po optymalizacji o połowę mniej. Z pewnością zastanawiacie się, dlaczego tam jest 9 zamiast 10? Zauważcie, że za każdym razem, kiedy zakończy się wykonywanie bloku pętli to wartość zmiennej $h jest preinkrementowana. Kod umyślnie podany w formacie skryptu PHP, ponieważ dla większości będzie zrozumiały.

Przy założeniu, że identyfikatory zapisujemy w takim formacie: \d{11}\r\n to nieskompresowana całość zajmuje 22,1 GB (bajtów: 23 740 730 000), a po spakowaniu WinRAR'em przy maksymalnej kompresji mamy 2,95 GB (bajtów: 3 171 925 429). Całkiem przyzwoicie, prawda? W zasadzie całe te \r\n jest niepotrzebne, bo wskaźnikiem wewnątrz pliku można w bardzo prosty sposób sterować. W zależności od struktury pliku ogólnie wygląda to tak, że inkrementujemy wartość wskaźnika pętli o np. 14 i odczytujemy pierwsze 11 znaków.

Pomijając techniczny bełkot zastanawia mnie jedna rzecz. W ciągu jednego dnia według tego algorytmu może urodzić się maksymalnie 5k dziewczyn i 5k chłopców. Nie jestem w stanie dokopać się do materiałów z GUS-u albo innego normalnego źródła, dlatego pozostawiam to Wam. Wyobraźcie sobie teraz sytuacje, w której jednego dnia urodzi się więcej niż przewidziane 10k dzieci. Zastanawia mnie czy nastąpi załamanie systemów informatycznych Smile W końcu wiele rzeczy opiera się o numer PESEL, a w takim przypadku nie będzie można przydzielić. Po ostatnich wpadkach ze stronami rządowymi wątpię, aby poprawki zostały wprowadzone w szybkim tempie. Zastanawia mnie czy szczęśliwcy będą wykluczeni z systemu? Jest na to jakiś przepis? Zauważcie, że wystarczyłoby się skrzyknąć w sieci, aby w przeciągu konkretnych 3 dni postarać się o dziecko i przy farcie któryś z nich byłby przebojowy dla tego kraju.

Gdyby ktoś zapyta o źródła programu do generowania pełnej bazy danych to z góry mówię, że nie udostępniam. Każdy ogarnięty programista jest w stanie zmontować to samodzielnie.

1826210000 = (5000 dziewczynek + 5000 chłopców) * ilość dni
ilość dni = od 1800 do 2299 czyli 500 lat w tym 121 przestępnych co daje nam 500 * 365 + 121

Grunt to podejście empiryczne stąd udostępniam zrzut ekranu końcowego wyniku całej zabawy. Pozdrawiam z tego miejsca towarzysza Sobaka i przypominam o wspólnych teoriach dotyczących ile to wszystko zajmie w liczbach Smile Kochane szacunki, prawda? Teraz Twoja kolej na analizę tego wszystkiego kolego.

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

CapaciousCore

Dodano 02.03.2012r. o 20:59
@Pablo_Wawa nie będę się z Tobą spierał odnośnie danych statystycznych, bo nie o to tu chodzi. Problem polega na tym, że w tym systemie jest dosłowny bajzel. Proponuje zapoznać się z projektem PESEL2. Czego to ludzie nie wymyślą aby zmarnować pieniądze owieczek. Znane są także wyjątki, kiedy to dwie osoby posiadają taki sam PESEL albo, kiedy nadany PESEL jest nieprawidłowy i potem powstają z tego tytułu problemy prawne. Sam program dla urzędów jest nieprawidłowo napisany.

Pablo_Wawa

Dodano 02.03.2012r. o 20:45
Te 10 tys. dzieci jednego dnia raczej się nigdy w Polsce nie urodzą. Nie wiem, ile statystycznie rodzi się dzieci jednego dnia, ale z danych GUS wynika, że ostatnio ok. 350-420 tys. (rocznie). Co daje (statystycznie) ok. 1000 dzieci dziennie. Do 10k dużo brakuje. A nawet jakby (cudem?) tak się stało, to jest na to proste (i logiczne) rozwiązanie - dzieci "ponadmiarowe" dostaną PESEL z datą kolejną (następny dzień) - w PESELu nie musi być zawsze tak, że pierwsze 6 cyfr koduje (właściwą) datę urodzenia - znane są wyjątki (błędy) i da się z tym żyć. A co najważniejsze, zachowa się niepowtarzalność numerów PESEL.

Sobak

Dodano 13.02.2012r. o 14:28
@Comandeer Wszystko kwestia tego żeby zgadzała się data i ostatnia cyfra (suma kontrolna), a sposób jej wyliczania nie jest zbyt dopracowany. Jest tam m.in. niedopatrzenie przy wyliczaniu wag poszczególnych cyfr PESEL-u o którym można doczytać sobie na Wiki.

Comandeer

Dodano 12.02.2012r. o 21:53
extra z tym ze wychodzi raptem 1,82% ze wszystkich możliwych kombinacji ;)

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)