Používání modula v klíčových údajích v dnešní době

Ostatní Používání modula v klíčových údajích v dnešní době

V praxi často narazíme na různá modula, která mají zvyšovat bezpečnost používaných údajů. Co to vlastně je, a k čemu to má opravdu sloužit? Princip modula je jednoduchý. Obecně spočívá v tom, že pro nějaký „klíčový údaj“ ve znakové podobě, který slouží k identifikaci nějakého reálného objektu, je stanoven algoritmus pro výpočet sumy z jednotlivých údajů. Ta potom musí být u korektního údaje bezezbytku dělitelná odpovídajícím číslem.

Obecně lze samozřejmě stanovit libovolný algoritmus pro libovolný text, kde například jako hodnoty do výpočtu sumy mohou vstupovat hodnoty representované číselnými znaky a u nečíselných znaků hodnoty podle tabulky např. ASCII kódy a podobně. Je potřeba si uvědomit, že kromě významových znaků, které slouží opravdu k identifikaci objektu, nám použitelný rozsah údaje ořezávají takzvané kontrolky. To jsou pro jednoduchost většinou číselné údaje a slouží k tomu, aby se významové znaky doplnily tak, aby po zjištění sumy pro daný algoritmus vyšlo odpovídající modulo.

Pokud máme modulo do deseti, stačí nám samozřejmě jedna kontrolka. Od 11 výše potřebujeme v desítkové soustavě kontrolky 2 a tak dále. Nejčastějším případem je používání modulo pro číselné údaje, kde algoritmus spočívá v tom, že pro jednotlivé pozice údaje jsou stanoveny váhy, kterými se vynásobí číslice na odpovídající pozici. Násobky se sečtou a tím se získá potřebná suma, ze které se vypočítá modulo. Pokud se někdo domnívá, že modulo má hlavně sloužit k tomu, aby bylo těžší natypovat správný údaj nebo před-ověřit jeho existenci, tak se trochu mýlí. Ono to sice tak působí - zvláště v dnešní době, kdy je existence záznamů ověřována oproti databázi. Původní účel a využití modula je ale poněkud hlubší. Původně bylo postaveno tak, aby co nejvíce zachytávalo chyby, které vznikají při ručním pořizování údajů. Jedná se nejčastěji o vynechání znaku, zdvojení znaku nebo jeho prohození. To jsou chyby zcela běžné, a přestože je veliká snaha a maximální úsilí o převedení této činnosti na „techniku“, je jasné, že se ještě poměrně dlouho bude na některých místech používat, protože technická řešení se pro tyto případy budou ještě dlouho pohybovat v oblasti neefektivnosti.

Podíváme li se na oblast našeho bankovnictví, tak původně bylo číslo účtu chráněno modulo 10 s opakujícími se vahami 1,3 a 5. Při inovaci systému bylo převedeno na modulo 11 s vahami od pravé strany doleva, které odpovídají mocninám 2. To je 1, 2, 4, 8 atd. Podle teoretiků nejúčinnější kombinace. Je to krásná ukázka, že teorie je jenom teorie a občas se do praxe nestrefí. Proč o tom tak „nehezky“ hovořím. Když se totiž podíváte na řadu vah tak, zjistíte, že přidám-li na konec řady hodnotu „0“, tak pro tento řetězec musí modulo vycházet taky. Jestliže předtím součet byl dělitelný beze zbytku, teď bude každé číslo vynásobeno číslici dvakrát větší, a suma tím pádem musí být opět dělitelná bezezbytku. Z toho vyplývá, že nové (aktuální) řešení nechytá vypuštění koncových nul. Když bude trochu přemýšlet, zjistíme, že díra je ještě větší. Totiž toto řešení také nechytá vypuštěné nebo vložené nuly mezi dvěma částmi, pro které samostatně vychází modulo.

Podařilo se mi ve Vás vzbudit pocit, že ta inovace byla krok z deště pod okap. Tak mu nepodléhejte, ono to totiž není pravda. Když něco analyzujeme, tak bychom neměli mít žádný ani pocitový „zájem“ na výsledku, pak totiž nehledáme jak to vlastně je, ale hledáme důkazy na to, že je to tak, jak bychom si přáli. A přesně v duchu těchto pravidel, jsem se rozhodl, že to lépe prozkoumám. Rozhodl jsem se napsat program (ve VB.NET a je přiložen), pomocí kterého si zjistím jak to vlastně je. Ten můj pokus měl následující postup.

  1. Vygeneroval jsem 50 000 náhodných různých 6místných kombinací jako základ pro vytvoření testovacích dat
  2. Ze základní sady jsem vytvořil data pro testování modulo 11 tím, že jsem je doplnil na 8místné řetězce s odpovídajícími kontrolkami pro modulo 11
  3. Stejným způsobem jsem vytvořil data pro testování starého způsobu s modulo 10 (jedna kontrolka byla „0“.). A tím jsem získal prakticky shodná data pro oba případy.
  4. Potom jsem napsal program, který postupně bral jednotlivé údaje. A pro každý údaj vytvořil nové kombinace s tím, že postupně vynechával jeden znak na každé pozici a v druhé fázi jej naopak zdvojil a ve třetí fázi postupně prohodil každou dvojici. Pro každou takto získanou kombinaci jsem zkontroloval, zda u ní vychází odpovídající modulo.

Výsledky byly překvapující a jsou následující:

Statistika zpracování

Modulo 11

počet případů 450 000 testovaných kombinací
Vynechání znaku - z toho nezachyceno 32 190
Po zdvojení nezachyceno 32 190
Po prohození nezachyceno 39 595

Modulo 10

počet případů 450 000 testovaných kombinací
Vynechání znaku - z toho nezachyceno 44 991
Po zdvojení nezachyceno 40 048
Po prohození nezachyceno 79 749

Prohození mělo o 1/8 méně kombinací.

V procentuálním vyjádření to dopadlo následovně:

Nezachycené změny

modulo11

zdvojení 7,15%
vynechaní 7,15%
Celkem 14,31%
prohození 7,70%
Celkem s prohozením 22,01%

modulo10

zdvojení 10,00%
vynechaní 8,90%
Celkem 18,90%
prohození 15,51%
Celkem s prohozením 34,40%

Je zajímavé, že přes ty díry, o kterých jsem mluvil má modulo 11 o třetinu lepší „špatné“ výsledky než modulo 10. Musíme si uvědomit, že se nejedná o účinnost zachycení, ale naopak o neúčinnost. Co je dále velice zajímavé a je způsobeno již zmiňovanou řadou mocnin dvojky, je to, že počet chyb při vynechání znaku a při zdvojení znaku je shodný a tato souvislost byla bez ohledu k počtu testovacích případů. Pokud nějaká kombinace umožňuje nějakou pozici vynechat, aniž by se tím porušilo modulo 11, tak současně umožňuje i hodnotu na shodné pozici zdvojit. Napřed jsem hledal, zda jsem se nepletl v programu. Dokonce jsem si začal v programu zapisovat protokol těchto případů, ale pak mi došlo, s čím to souvisí.

Co z uvedeného vyplývá? Modulo 11 je opravdu účinnější než staré modulo 10. Je schopno zachytit 78% možných běžných chyb typování, a pokud by se při přidělování nových hodnot vyloučily kombinace dovolující vynechání resp. zdvojení, tak by se účinnost zvedla ještě na 85%. To ale vzhledem k rozsahu zachycení chyb, ve kterém se pohybujeme, pravděpodobnosti chyby a omezení významového rozsahu identifikátoru, by bylo již neefektivní.


 

Stáhnout

Staženo 182x (559 B)

 

  Aktivity (2)

Článek pro vás napsal Petr Vocel
Avatar
Autor se méně soustředí na nástroje a pozornost věnuje více tomu jak dostat funkčnost reaálného světa do počítače.

Jak se ti líbí článek?
Celkem (4 hlasů) :
55555


 


Miniatura
Předchozí článek
Vzájemný zápočet
Miniatura
Všechny články v sekci
Články nejen o programování
Miniatura
Následující článek
Programátorská soutěž GeekWork 2016

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!