Univerzální hašování je typ hašování , ve kterém se nepoužívá jedna konkrétní hašovací funkce, ale výběr je proveden z dané rodiny podle náhodného algoritmu [1] [2] . Tento přístup zajišťuje jednotné hashování: pro další klíč je pravděpodobnost jeho umístění do libovolné buňky stejná. Je známo několik rodin univerzálních hašovacích funkcí, které mají četné aplikace v počítačové vědě , zejména v hašovacích tabulkách , pravděpodobnostních algoritmech a kryptografii .
Koncept univerzálního hašování byl poprvé představen v článku [1] Cartera a Wegmana v roce 1979.
Zpočátku bylo univerzální hašování vyvinuto jako algoritmus nezávislý na vstupu, který běží v průměru v lineárním čase a je určen k ukládání a získávání klíčů z hašovací tabulky. Nezávislost na vstupu znamená, že pro jakoukoli sekvenci vstupů budou odpovídající hodnoty hash prvků sekvence rovnoměrně rozloženy v tabulce hash. Když je tato podmínka splněna, ukáže se, že průměrná doba běhu algoritmu pro jakákoli data je srovnatelná s dobou běhu hashovací funkce používané k distribuci známých dat [1] .
Vytvořený univerzální hašovací algoritmus byl náhodným výběrem hašovací funkce z určité množiny hašovacích funkcí (nazývaných univerzální rodina hašovacích funkcí), které mají určité vlastnosti. Autoři prokázali, že v případě univerzálního hašování se počet přístupů k hašovací tabulce (v průměru přes všechny funkce z rodiny) pro libovolná vstupní data velmi blíží teoretickému minimu pro případ pevné hašovací funkce s náhodně rozloženým vstupní data [1] .
Pomocí univerzálního hashování autoři chtěli [1] :
V [1] Wegman a Carter aplikovali univerzální hašování na sestavení hashovací tabulky, i když později bylo univerzální hašování použito v jiných oblastech (viz #Usage ).
Dovolit být množina klíčů, být konečná množina hašovacích funkcí mapujících na množinu . Vezměme libovolné a a definujme kolizní funkci :
Pokud , pak říkáme , že došlo ke kolizi . Kolizní funkci můžete definovat ne pro jednotlivé prvky , ale pro celou sadu prvků – k tomu je třeba přidat kolizní funkce přes všechny prvky ze sady. Pokud je například sada hašovacích funkcí, , , pak pro kolizní funkci dostaneme:
Navíc na pořadí součtu nezáleží.
Definice. Rodina hašovacích funkcí se nazývá univerzální [1] if
Lze uvést jinou definici, která je ekvivalentní této.
Definice . Rodina hašovacích funkcí se nazývá univerzální [3] [4] if
Následující věta definuje dolní mez funkce pro libovolnou rodinu hašovacích funkcí [1] .
Věta 1. Pro jakoukoli rodinu (ne nutně univerzální) hašovacích funkcí existují takové, které
Z věty 1 vyplývá, že dolní mez kolizní funkce je blízká v případě, kdy . Ve skutečnosti tomu tak často je. Nechte kompilátor například mapovat tisíc proměnných na sekvence sedmi anglických písmen. Poté , a
Pro univerzální rodinu hašovacích funkcí to znamená, že horní a dolní mez kolizní funkce jsou si velmi blízké [1] .
V [1] bylo univerzální hashování použito k uspořádání hashovacích tabulek s rozlišením kolizí pomocí řetězení . Níže jsou uvedeny teorémy, které poskytují některé odhady hodnot kolizní funkce a výkonu hašování v případě uspořádání hashovací tabulky s rozlišením kolizí metodou řetězců.
Dovolit je univerzální rodina hashovacích funkcí, které mapují sadu klíčů na sadu . Nechť se použije nějaká náhodná funkce k uspořádání hashovací tabulky s rozlišením kolizí metodou řetězců, tedy pomocí lineárního seznamu . Pokud hashovací funkce mapovala podmnožinu klíčů do tabulky, pak průměrná délka propojených seznamů bude . Následující věta uvádí odhad kolizní funkce v případě univerzální rodiny.
Věta 2. [1] Nechť být libovolný prvek množiny , být libovolná podmnožina množiny . Nechť je funkce náhodně vybrána z univerzální rodiny hašovacích funkcí . Pak platí následující odhad:
Tento výsledek lze použít k výpočtu očekávaného výkonu hash pro sekvenci dotazů. Nejprve si ale musíme ujasnit, co se rozumí výkonem. Chcete-li to provést, musíte definovat koncept nákladů - cena jednoho dotazu do hashovací tabulky podle klíče je číslo , kde je sada klíčů dříve umístěná v tabulce, a samotná hashovací tabulka používá metodu řetězu ( to je počet operací potřebných k dokončení jedné ). Cena hashovací funkce na posloupnosti požadavků je součtem nákladů na jednotlivé požadavky v posloupnosti specifikované v . Náklady jsou v podstatě kvantitativním měřítkem produktivity.
Věta 3. [1] Nechť Dovolit je posloupnost dotazů obsahujících vložení. Dovolit je univerzální rodina hašovacích funkcí. Pak pro náhodně vybranou hashovací funkci platí nerovnost :
.
Poměrně často [1] , je znám přibližný počet klíčů, které je potřeba uložit do hashovací tabulky. Potom můžete zvolit velikost hashovací tabulky tak, aby poměr byl přibližně roven 1. Podle věty 3 budou tedy očekávané náklady na provedení sekvence dotazů přímo úměrné počtu dotazů . Navíc to platí pro jakoukoli sekvenci dotazů a ne pro nějakou „průměrnou“ sekvenci.
Pro jakoukoli náhodně vybranou hashovací funkci z univerzální rodiny se tedy její výkon ukazuje jako docela dobrý. Otázkou zůstává, zda je potřeba hashovací funkci časem měnit, a pokud ano, jak často.
V případě hašovacích tabulek změna hašovacích funkcí často vede k velké režii. Pokud je například hašovací tabulka velmi velká, změna hašovací funkce bude vyžadovat přesun velkého množství dat. Existuje několik strategií pro výběr hashovací funkce. Nejjednodušší strategií je náhodně vybrat hashovací funkci na začátku práce a do konce práce ji neměnit. V tomto případě je však výkon hašovací funkce výrazně nižší, než se očekávalo [1] . Další strategií je čas od času spočítat počet kolizí a změnit hashovací funkci, pokud je počet výrazně vyšší, než se očekávalo. Tento přístup poskytuje dobrý výkon za předpokladu, že je hašovací funkce vybrána náhodně.
Tato část je věnována konstrukci univerzálních rodin hašovacích funkcí, z nichž je hašovací funkce náhodně vybrána.
Existuje několik rodin univerzálních hašovacích funkcí, které se liší v tom, pro jaká data jsou tyto funkce určeny: skaláry (hašování čísel), vektory s pevnou délkou (hašování vektorů ), vektory s proměnnou délkou (hašování řetězců).
Zvolíme prvočíslo a vezmeme v úvahu pole a jeho multiplikativní grupu .
Teorém. Množina funkcí tvaru , kde , je univerzální (toto bylo ukázáno v práci Cartera a Wegmana [1] ).
Vlastně jen když
Pokud , pak rozdíl a lze převrátit modulo . Odtud se můžete dostat
Tato rovnice má řešení a pravá strana může nabývat hodnot. Pravděpodobnost kolizí tedy je
,která inklinuje jako .
Nechť je číslo prvočíslo. Nechť jsou vstupní data reprezentována jako posloupnost prvků patřících do , tj .
Pro všechny sekvence formuláře zvažte funkci formuláře
Předpokládejme to
Zřejmě obsahuje
Teorém. Set je generická rodina hašovacích funkcí (to také ukázali Carter a Wegman [1] ).
Opravdu, jestliže , a , pak jestliže a jediný jestliže
Od , pak pro které je zadaná rovnice splněna. Počet takových posloupností je roven , a tedy i počet funkcí od , které nerozlišují a rovnají se také . Ale odkud plyne univerzálnost.
Tuto rodinu funkcí lze zobecnit [5] . Uvažujme rodinu funkcí a pro vektor uvažujme hashovací funkci
, kdePak bude sada takových funkcí také univerzální rodinou.
V tomto případě jsou vstupy do hašovací funkce vektory, jejichž délka není pevnou hodnotou. Pokud je možné omezit délku všech vektorů na nějaké číslo , pak lze použít přístup, který byl použit pro vektory pevné délky. V tomto případě, pokud je délka vektoru menší než , je možné doplnit vektor nulami tak, aby se jeho délka rovnala [5]
Nyní předpokládejme, že není možné předem vybrat číslo , které omezuje délku všech vektorů. Pak můžeme navrhnout následující přístup [6] : nechť existuje vstupní vektor . Předpokládejme, že a budeme považovat složky vektoru za koeficienty polynomu : kde .
Pak pro vektory s proměnnou délkou lze univerzální hashovací funkci definovat takto:
kde
je obecná hashovací funkce pro číselné argumenty.
Autentizační kódy zpráv UMAC , Poly1305-AES a některé další jsou založeny na použití univerzálního hashování [7] [8] [9] . V těchto kódech má každá zpráva svou vlastní hashovací funkci v závislosti na jejím jednorázovém jedinečném čísle.
Obecnou rodinu hašovacích funkcí lze použít, když je vyžadováno velké množství „dobrých“ hašovacích funkcí. Programátoři často tráví spoustu času analýzou hashovacích funkcí na různých datech a snaží se vybrat tu správnou [10] . Čas hledání lze zkrátit tím, že vezmete univerzální rodinu hašovacích funkcí a náhodně vyberete několik funkcí z této rodiny [1] .
Teoretický význam univerzálního hašování spočívá v tom, že poskytuje „dobrou“ vazbu na průměrný výkon algoritmů, které hašování používají. Například univerzální hashování bylo použito v algoritmech uvedených v [11] [12] [13] .
V teoretické kryptografii se ukázalo, že pomocí univerzálních hashovacích funkcí je možné vybudovat autentizační systém s maximální dosažitelnou utajeností [1] . Příkladem univerzální hashovací funkce s prokázanou kryptografickou silou je hashovací funkce SWIFFT .
Navíc jednou z nejdůležitějších aplikací univerzálního hashování je koordinované načítání [2] .