Universaali hajautus on hajautustyyppi , jossa ei käytetä yhtä tiettyä hajautusfunktiota, vaan valitaan tietystä perheestä satunnaisen algoritmin mukaan [1] [2] . Tämä lähestymistapa varmistaa tasaisen hajautusarvon: seuraavan avaimen todennäköisyys sijoittaa se mihin tahansa soluun on sama. Useita yleismaailmallisten hajautusfunktioiden perheitä tunnetaan ja niillä on lukuisia sovelluksia tietojenkäsittelytieteessä , erityisesti hash-taulukoissa , todennäköisyyslaskentaan perustuvissa algoritmeissa ja kryptografiassa .
Yleisen hajautuskäsitteen esittelivät ensimmäisen kerran artikkelissa [1] Carter ja Wegman vuonna 1979.
Aluksi universaali hajautus kehitettiin syötteestä riippumattomaksi algoritmiksi, joka toimii keskimäärin lineaarisessa ajassa ja on suunniteltu tallentamaan ja hakemaan avaimia hash-taulukosta. Syöttöriippumattomuus tarkoittaa, että minkä tahansa syötesarjan kohdalla sekvenssin elementtien vastaavat hajautusarvot jakautuvat tasaisesti hash-taulukossa. Kun tämä ehto täyttyy, minkä tahansa datan algoritmin keskimääräinen ajoaika osoittautuu verrattavissa tunnetun datan jakamiseen käytetyn hash-funktion ajoaikaan [1] .
Luotu yleinen hajautusalgoritmi oli satunnainen valinta hash-funktiosta tietyistä hash-funktioiden joukosta (kutsutaan yleiseksi hajautusfunktioiden perheeksi), joilla on tietyt ominaisuudet. Kirjoittajat ovat osoittaneet, että yleisen tiivistyksen tapauksessa hajautustaulukon hakujen määrä (keskimäärin kaikista perheen funktioista) mielivaltaiselle syöttödatalle on hyvin lähellä teoreettista minimiä kiinteän hajautusfunktion tapauksessa satunnaisesti jakautuneena. syöttötiedot [1] .
Kirjoittajat halusivat käyttää yleistä tiivistystä [1] :
Vuonna [1] Wegman ja Carter käyttivät yleistä tiivistystä hajautustaulukon rakentamiseen, vaikka myöhemmin yleistä tiivistystä on käytetty muilla alueilla (katso #Usage ).
Antaa olla joukko avaimia, olla rajallinen joukko hash-funktioita , jotka kartoitetaan joukkoon . Otetaan mielivaltainen ja määritellään törmäysfunktio :
Jos , niin sanomme , että kyseessä on törmäys . Voit määrittää törmäysfunktion ei yksittäisille elementeille , vaan kokonaiselle elementtijoukolle - tätä varten sinun on lisättävä törmäysfunktiot joukon kaikkien elementtien päälle. Esimerkiksi, jos on joukko hash-funktioita, , , niin törmäysfunktiolle saamme:
Lisäksi summausjärjestyksellä ei ole väliä.
Määritelmä. Hash-funktioiden perhettä kutsutaan universaaliksi [1] if
Voidaan antaa toinen määritelmä, joka vastaa tätä.
määritelmä . Hash-funktioiden perhettä kutsutaan universaaliksi [3] [4] if
Seuraava lause määrittelee funktion alarajan mielivaltaiselle hajautusfunktioperheelle [1] .
Lause 1. Jokaiselle perheelle (ei välttämättä universaalille) hash-funktioille on olemassa sellainen, että
Lauseesta 1 seuraa, että törmäysfunktion alaraja on lähellä tapauksessa , kun . Itse asiassa näin usein onkin. Esimerkiksi, anna kääntäjän kartoittaa tuhat muuttujaa seitsemän englanninkielisen kirjaimen sekvensseihin. Sitten , a
Universaalille hajautusfunktioperheelle tämä tarkoittaa, että törmäysfunktion ylä- ja alarajat ovat melko lähellä [1] .
Vuonna [1] yleistä tiivistystä käytettiin hajautustaulukoiden järjestämiseen törmäysresoluutiolla ketjuttamalla . Alla on lauseita, jotka antavat joitain arvioita törmäysfunktion arvoista ja hajautussuorituskyvystä, jos tiivistetaulukko järjestetään törmäysresoluutiolla ketjujen menetelmällä.
Antaa olla yleinen hash-funktioiden perhe, joka kuvaa avainten joukon joukkoon . Käytetään jotain satunnaista funktiota hajautustaulukon järjestämiseen törmäysresoluutiolla ketjujen menetelmällä eli lineaarista listaa käyttäen . Jos hash-funktio on yhdistänyt taulukkoon avaimien osajoukon , linkitettyjen luetteloiden keskimääräinen pituus on . Seuraava lause antaa arvion törmäysfunktiosta universaalin perheen tapauksessa.
Lause 2. [1] Olkoon mielivaltainen joukon alkio , olla joukon mielivaltainen osajoukko . Valitaan funktio satunnaisesti yleisestä hash-funktioiden perheestä . Sitten seuraava arvio pätee:
Tämän tuloksen avulla voidaan laskea odotettu hash-tehokkuus kyselysarjalle. Mutta ensin meidän on selvennettävä, mitä suorituskyvyllä tarkoitetaan. Tätä varten sinun on määritettävä kustannusten käsite - yhden kyselyn hinta hash-taulukkoon avaimella on numero , jossa on aiemmin taulukkoon sijoitettujen avainten joukko ja itse hash-taulukko käyttää ketjumenetelmää ( eli tämä on yhden toiminnon suorittamiseen tarvittavien toimintojen määrä ). Hajautusfunktion hinta pyyntösarjassa on yksittäisten pyyntöjen kustannusten summa kohdassa määritetyssä järjestyksessä . Kustannukset ovat pohjimmiltaan tuottavuuden määrällinen mitta.
Lause 3. [1] Olkoon lisäyksiä sisältävä kyselysarja . Antaa olla yleinen hash-funktioiden perhe. Sitten satunnaisesti valitulle hash -funktiolle epäyhtälö on tosi :
.
Melko usein [1] hajautustaulukkoon tallennettavien avainten likimääräinen määrä tiedetään. Sitten voit valita hash-taulukon koon niin, että suhde on suunnilleen yhtä suuri kuin 1. Näin ollen Lauseen 3 mukaan kyselysarjan suorittamisen odotettu hinta on suoraan verrannollinen kyselyjen määrään . Lisäksi tämä pätee mille tahansa kyselysarjalle , ei jollekin "keskimääräiselle" sekvenssille.
Siten minkä tahansa universaalista perheestä satunnaisesti valitulle hash-funktiolle sen suorituskyky osoittautuu melko hyväksi. Kysymys jää siitä, pitääkö hash-funktiota muuttaa ajan myötä, ja jos on, kuinka usein.
Hajautustaulukoiden tapauksessa tiivistefunktioiden muuttaminen johtaa usein paljon yleiskustannuksiin. Jos tiivistetaulukko on esimerkiksi erittäin suuri, tiivistefunktion muuttaminen vaatii suuren datamäärän siirtämistä. Hajautusfunktion valitsemiseen on useita strategioita. Yksinkertaisin strategia on valita satunnaisesti hajautusfunktio työn alussa eikä muuttaa sitä ennen työn lopussa. Tässä tapauksessa hajautusfunktion suorituskyky on kuitenkin huomattavasti odotettua alhaisempi [1] . Toinen strategia on laskea törmäysten määrä ajoittain ja muuttaa hash-funktiota, jos määrä on huomattavasti odotettua suurempi. Tämä lähestymistapa tarjoaa hyvän suorituskyvyn, jos hash-funktio valitaan satunnaisesti.
Tämä osio on omistettu hajautusfunktioiden universaalien perheiden rakentamiselle, joista valitaan satunnaisesti hash-funktio.
Universaalien hajautusfunktioiden perheet eroavat toisistaan sen suhteen, mihin dataan nämä funktiot on tarkoitettu: skalaarit (lukuhajautus), kiinteäpituiset vektorit (vektorihajautus), muuttuvapituiset vektorit (merkkijonohajautus).
Valitsemme alkuluvun ja tarkastelemme kenttää ja sen kertojaryhmää .
Lause. Muodon funktiojoukko , jossa , on universaali (Tämä esitettiin Carterin ja Wegmanin työssä [1] ).
Itse asiassa vain silloin
Jos , niin ero ja voidaan kääntää modulo . Täältä saat
Tällä yhtälöllä on ratkaisuja, ja oikea puoli voi ottaa arvoja. Näin ollen törmäysten todennäköisyys on
,joka pyrkii .
Olkoon luku alkuluku. Esitetään syöttödata ryhmään kuuluvien elementtien sarjana , eli .
Harkitse muodon funktiota kaikissa muodon sarjoissa
Oletetaan, että
Ilmeisesti sisältää
Lause. Set on yleinen hash-funktioiden perhe (tämän ovat osoittaneet myös Carter ja Wegman [1] ).
Todellakin, jos , ja , niin jos ja vain jos
Koska , jolloin jolle määritetty yhtälö täyttyy. Tällaisten sekvenssien määrä on yhtä suuri kuin , ja näin ollen funktioiden lukumäärä , jotka eivät eroa toisistaan ja on myös yhtä suuri kuin . Mutta mistä universaalisuus seuraa.
Tämä funktioperhe voidaan yleistää [5] . Tarkastellaan funktioiden perhettä ja vektorille tiivistefunktiota
, missäSilloin tällaisten toimintojen joukko on myös yleinen perhe.
Tässä tapauksessa hajautusfunktion syötteet ovat vektoreita, joiden pituus ei ole kiinteä arvo. Jos kaikkien vektorien pituus on mahdollista rajoittaa johonkin numeroon , voidaan soveltaa lähestymistapaa, jota käytettiin kiinteäpituisille vektoreille. Tässä tapauksessa, jos vektorin pituus on pienempi kuin , on mahdollista täydentää vektoria nollalla niin, että sen pituus on yhtä suuri kuin [5]
Oletetaan nyt, että ei ole mahdollista valita ennalta lukua , joka rajoittaa kaikkien vektoreiden pituutta. Sitten voidaan ehdottaa seuraavaa lähestymistapaa [6] : olkoon tulovektori . Oletetaan, että ja tarkastellaan vektorin komponentteja polynomin kertoimilla : missä .
Sitten vaihtelevan pituisille vektoreille universaali hash-funktio voidaan määritellä seuraavasti:
missä
on yleinen hajautusfunktio numeerisille argumenteille.
Viestien todennuskoodit UMAC , Poly1305-AES ja jotkut muut perustuvat yleisen hajautuskoodin käyttöön [7] [8] [9] . Näissä koodeissa jokaisella viestillä on oma hajautustoimintonsa sen kertaluonteisesta yksilöllisestä numerosta riippuen.
Yleistä hash-funktioiden perhettä voidaan käyttää, kun tarvitaan suuri määrä "hyviä" hash-funktioita. Ohjelmoijat käyttävät usein paljon aikaa analysoidessaan eri datan hash-funktioita ja yrittäessään valita oikean [10] . Hakuaikaa voidaan lyhentää ottamalla yleinen hash-funktioiden perhe ja valitsemalla satunnaisesti useita funktioita tästä perheestä [1] .
Yleisen tiivistyksen teoreettinen merkitys on, että se tarjoaa "hyvän" rajan tiivistystä käyttävien algoritmien keskimääräiselle suorituskyvylle. Esimerkiksi universaalia hajautusta on sovellettu julkaisussa [11] [12] [13] esitetyissä algoritmeissa .
Teoreettisessa kryptografiassa osoitettiin, että universaalien hash-funktioiden avulla on mahdollista rakentaa autentikointijärjestelmä , jolla on suurin saavutettava salaisuus [1] . Esimerkki yleisestä hajautusfunktiosta, jolla on todistettu salauksen vahvuus , on SWIFFT- tiivistefunktio .
Lisäksi yksi yleisen tiivistyksen tärkeimmistä sovelluksista on koordinoitu haku [2] .