Az univerzális kivonatolás a kivonatolás egy olyan fajtája , amelyben nem egy adott hash függvényt használunk, hanem egy véletlenszerű algoritmus alapján egy adott családból választanak [1] [2] . Ez a megközelítés biztosítja az egységes kivonatolást: a következő kulcs esetén a valószínűsége annak, hogy bármely cellában elhelyezhető. Az univerzális hash függvények számos családja ismert, és számos alkalmazási területük van a számítástechnikában , különösen hash-táblázatokban , valószínűségi algoritmusokban és kriptográfiában .
Az univerzális hash fogalmát Carter és Wegman [1] vezették be először 1979-ben.
Kezdetben az univerzális hash-t egy bemenettől független algoritmusként fejlesztették ki, amely átlagosan lineáris időben fut, és a kulcsok tárolására és lekérésére készült egy hash táblából. A bemeneti függetlenség azt jelenti, hogy bármely bemeneti sorozat esetén a sorozat elemeinek megfelelő hash értékei egyenletesen oszlanak el a hash táblában. Ha ez a feltétel teljesül, az algoritmus átlagos futási ideje bármely adatra összehasonlíthatónak bizonyul az ismert adatok elosztására használt hash függvény futási idejével [1] .
A létrehozott univerzális kivonatoló algoritmus egy hash függvény véletlenszerű kiválasztása volt a hash függvények bizonyos halmazából (ezt univerzális hash függvénycsaládnak nevezik), amelyek bizonyos tulajdonságokkal rendelkeznek. A szerzők kimutatták, hogy univerzális kivonatolás esetén a hash tábla hozzáférések száma (átlagosan a család összes függvényére) tetszőleges bemeneti adatokhoz nagyon közel van az elméleti minimumhoz egy véletlenszerűen elosztott hash függvény esetén. bemeneti adatok [1] .
Az univerzális hash segítségével a szerzők a következőket akarták [1] :
Az [1]-ben Wegman és Carter univerzális kivonatolást alkalmazott egy hash-tábla felépítéséhez, bár később az univerzális hash-t más területeken is alkalmazták (lásd #Usage ).
Legyen kulcshalmaz , a halmazra leképező hash függvények véges halmaza . Vegyünk tetszőleges és definiáljuk az ütközési függvényt :
Ha , akkor azt mondjuk , hogy ütközés van . Az ütközési függvényt nem egyes elemekhez , hanem egy egész elemkészlethez definiálhatja – ehhez hozzá kell adnia az ütközési függvényeket a halmaz összes eleméhez. Például, ha hash függvények halmaza, , , akkor az ütközési függvényre a következőt kapjuk:
Ráadásul az összegzés sorrendje sem számít.
Meghatározás. A hash függvények családját univerzálisnak [1] nevezzük, ha
Adható egy másik, ezzel egyenértékű definíció.
Meghatározás . A hash függvények családját univerzális [3] [4] ha
A következő tétel egy tetszőleges hash-függvénycsalád függvény alsó korlátját határozza meg [1] .
1. Tétel. Bármely (nem feltétlenül univerzális) hash függvénycsaládhoz létezik olyan, hogy
Az 1. Tételből az következik, hogy az ütközési függvény alsó korlátja közel van abban az esetben, ha . Valójában gyakran ez a helyzet. Például hagyja, hogy a fordító ezer változót képezzen le hét angol betűből álló sorozatokra. Ezután a
Egy univerzális hash függvénycsalád esetében ez azt jelenti, hogy az ütközési függvény felső és alsó határa meglehetősen közel van [1] .
[1]-ben az univerzális hash-t használták az ütközésfeloldású hash-táblák láncolással történő rendezésére . Az alábbiakban olyan tételek találhatók, amelyek néhány becslést adnak az ütközési függvény értékeiről és a kivonatolási teljesítményről abban az esetben, ha egy hash táblát rendezünk ütközésfeloldással láncok módszerével.
Legyen egy univerzális hash függvénycsalád, amely leképezi a kulcskészletet a halmazra . Legyen valamilyen véletlenfüggvény egy ütközésfelbontású hash tábla rendezésére láncok módszerével, azaz lineáris lista segítségével . Ha a hash függvény a kulcsok egy részhalmazát rendelte hozzá a táblázathoz, akkor a csatolt listák átlagos hossza . A következő tétel becslést ad az ütközési függvényre univerzális család esetén.
2. Tétel. [1] Legyen a halmaz tetszőleges eleme , legyen a halmaz tetszőleges részhalmaza . Legyen a függvény véletlenszerűen kiválasztva a hash függvények univerzális családjából . Ekkor a következő becslés érvényes:
Ez az eredmény használható a várt hash-teljesítmény kiszámításához egy lekérdezéssorozathoz. De először tisztáznunk kell, mit értünk teljesítmény alatt. Ehhez meg kell határozni a költség fogalmát - a hash tábla kulcsonkénti lekérdezésének költsége a szám , ahol a korábban a táblában elhelyezett kulcsok halmaza, és maga a hash tábla a lánc módszert használja ( vagyis ennyi művelet elvégzéséhez szükséges ). Egy kérések sorozatán lévő hash függvény költsége az egyes kérések költségeinek összege a -ban meghatározott sorrendben . A költség alapvetően a termelékenység mennyiségi mérőszáma.
3. Tétel. [1] Legyen beszúrásokat tartalmazó lekérdezések sorozata . Legyen a hash függvények univerzális családja. Ekkor egy véletlenszerűen kiválasztott hash függvényre az egyenlőtlenség igaz :
.
Elég gyakran [1] , hogy hozzávetőlegesen hány kulcsot kell tárolni egy hash táblában. Ezután kiválaszthatja a hash tábla méretét úgy, hogy az arány megközelítőleg 1 legyen. Ezért a 3. tétel szerint a lekérdezések sorozatának végrehajtásának várható költsége egyenesen arányos a lekérdezések számával . Sőt, ez igaz bármely lekérdezési sorozatra , nem pedig valamilyen „átlagos” sorozatra.
Így az univerzális család bármely véletlenszerűen kiválasztott hash függvényének teljesítménye elég jónak bizonyul. A kérdés továbbra is az, hogy a hash függvényt idővel módosítani kell-e, és ha igen, milyen gyakran.
A hash táblák esetében a hash függvények megváltoztatása gyakran sok többletköltséggel jár. Például, ha a hash tábla nagyon nagy, a hash függvény megváltoztatásához nagy mennyiségű adat áthelyezésére lesz szükség. Számos stratégia létezik a hash függvény kiválasztására. A legegyszerűbb stratégia az, hogy a munka elején véletlenszerűen választunk ki egy hash függvényt, és nem változtatjuk meg a munka végéig. Ebben az esetben azonban a hash függvény teljesítménye lényegesen alacsonyabb a vártnál [1] . Egy másik stratégia, hogy időről időre megszámolja az ütközések számát, és módosítja a hash függvényt, ha a szám jelentősen magasabb a vártnál. Ez a megközelítés jó teljesítményt biztosít, feltéve, hogy a hash függvényt véletlenszerűen választják ki.
Ez a rész a hash függvények univerzális családjainak felépítésével foglalkozik, amelyek közül véletlenszerűen kiválasztunk egy hash függvényt.
Az univerzális hash-függvényeknek több családja is különbözik abban, hogy ezeket a függvényeket milyen adatokra szánják: skalárok (számkivonat), fix hosszúságú vektorok (vektorkivonat), változó hosszúságú vektorok (sztring hash).
Kiválasztunk egy prímszámot , és figyelembe vesszük a mezőt és annak szorzócsoportját .
Tétel. A , ahol , alak függvénykészlete univerzális (ezt Carter és Wegman [1] munkájában mutatták ki ).
Igaz, csak akkor, amikor
Ha , akkor a különbség és modulo megfordítható . Innen lehet kapni
Ennek az egyenletnek vannak megoldásai, és a jobb oldal értéket vehet fel . Így az ütközések valószínűsége az
,amely hajlamos mint .
Legyen a szám prím. Legyen a bemeneti adatok a -hoz tartozó elemek sorozataként ábrázolva , azaz .
Az űrlap összes sorozata esetén vegye figyelembe az űrlap függvényét
Tegyük fel, hogy
Nyilván tartalmaz
Tétel. A halmaz a hash függvények általános családja (Ezt Carter és Wegman is megmutatta [1] ).
Valóban, ha , és , akkor akkor és csak akkor
Mivel , akkor amelyre a megadott egyenlet teljesül. Az ilyen sorozatok száma egyenlő -vel , és ebből következően a -tól származó függvények száma , amelyek nem tesznek különbséget , és egyenlőek a -val . De ahonnan az egyetemesség következik.
Ez a függvénycsalád általánosítható [5] . Tekintsünk egy függvénycsaládot , és egy vektor esetén vegyük figyelembe a hash függvényt
, aholAkkor az ilyen funkciók halmaza is univerzális család lesz.
Ebben az esetben a hash függvény bemenetei olyan vektorok, amelyek hossza nem fix érték. Ha lehetséges az összes vektor hosszát valamilyen számra korlátozni , akkor alkalmazhatjuk azt a megközelítést, amelyet a fix hosszúságú vektoroknál használtunk. Ebben az esetben, ha a vektor hossza kisebb, mint , akkor a vektor kiegészíthető nullákkal úgy, hogy a hossza [5] legyen.
Most tegyük fel, hogy nem lehet előre kiválasztani egy számot , amely korlátozza az összes vektor hosszát. Ekkor a következő megközelítést javasolhatjuk [6] : legyen bemeneti vektor . Tegyük fel, hogy a vektor komponenseit a polinom együtthatóinak tekintjük : ahol .
Ezután változó hosszúságú vektorok esetén az univerzális hash függvény a következőképpen definiálható:
ahol
egy általános hash függvény numerikus argumentumokhoz.
Az UMAC , Poly1305-AES és néhány más üzenet hitelesítési kódok univerzális hashelésen alapulnak [7] [8] [9] . Ezekben a kódokban minden üzenet saját hash funkcióval rendelkezik, az egyszeri egyedi számtól függően.
A hash függvények általános családja akkor használható, ha nagyszámú "jó" hash függvényre van szükség. A programozók gyakran sok időt töltenek azzal, hogy különféle adatok hash függvényeit elemezzék , és megpróbálják kiválasztani a megfelelőt [10] . A keresési idő csökkenthető, ha egy univerzális hash függvénycsaládot veszünk, és ebből a családból véletlenszerűen választunk ki több függvényt [1] .
Az univerzális kivonatolás elméleti jelentősége abban rejlik, hogy "jó" korlátot ad a hash-t használó algoritmusok átlagos teljesítményére. Például univerzális hash-t alkalmaztak a [11] [12] [13] -ban bemutatott algoritmusokban .
Az elméleti kriptográfiában megmutatták, hogy az univerzális hash függvények segítségével a maximálisan elérhető titkossággal rendelkező hitelesítési rendszert lehet felépíteni [1] . A bizonyított kriptográfiai erősségű univerzális hash függvényre példa a SWIFFT hash függvény .
Ráadásul az univerzális kivonatolás egyik legfontosabb alkalmazása a koordinált letöltés [2] .