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

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($h, 11)) === true)
{
$h += 9 - $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

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

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.
Dodaj komentarz
Zezwolono używać:
BBCode
Zabroniono używać:
znaczników HTML
CapaciousCore