Tarvitsetko tunnisteen, joka ei törmää sellaisen kanssa, jonka joku toinen teki koneella, josta et ole koskaan kuullut, ilman kenenkään luvan kysymistä? Juuri tämä on UUID:n tehtävä. Se on 128-bittinen luku, joka kirjoitetaan 36 merkkinä tutussa 8-4-4-4-12 -muodossa, ja sen koko suunnittelu perustuu siihen, että kahta samanlaista ei synny, vaikka kukaan ei koordinoi niiden jakamista. Tämä ilmainen generaattori tekee ne selaimessasi: valitse versio kohdassa «Versio», ilmoita tarvitsemasi «Määrä» ja paina «Generoi». Sivu aukeaa yhdellä v4-tunnisteella, jota useimmat projektit haluavat, joten ensimmäinen tunniste on vain yhden klikkauksen päässä.
Selaimesi rakentaa jokaisen tunnisteen Web Crypto API:n kautta. Versio 4 käyttää crypto.randomUUID() -funktiota, jos selain tarjoaa sen, ja muuten crypto.getRandomValues() -funktiota — kryptografisesti vahvaa satunnaisuuden lähdettä sen sijaan, että se käyttäisi JavaScriptin näennäissatunnaista funktiota kuten Math.random(). Versio 7 asettaa 48-bittisen millisekuntiaikaleiman alkuun, sitten 12-bittisen laskurin, joka nousee saman millisekunnin sisällä, ja sitten 62 satunnaista bittiä, mikä on RFC 9562:n kuvaama järjestysmenetelmä; tuon laskurin ansiosta tuhannen erä tulostuu järjestyksessä eikä sekoitettuna. Versio 1 yhdistää aikaleiman satunnaiseen solmutunnisteeseen, johon on asetettu multicast-bitti, joten se ei koskaan kanna verkkokorttisi osoitetta 1990-luvun alkuperäisten toteutusten tapaan. Versiot 3 ja 5 eivät ole lainkaan satunnaisia: ne tiivistävät nimiavaruuden ja nimen yhdessä käyttäen MD5- ja SHA-1-algoritmeja, ja tuo tiivistys tapahtuu myös laitteellasi. Mitään ei lähetetä palvelimelle, mitään ei lokiteta, ja kun sivu on ladattu, se jatkaa toimintaansa ilman verkkoyhteyttä.
«Versio» on kenttä, joka ratkaisee kaiken muun. Versio 4 on 122 satunnaista bittiä ilman rakennetta — oletusvalinta ja oikea vastaus, kun tunnisteen täytyy olla vain yksilöllinen. Versio 7 säilyttää 62 satunnaista bittiä, mutta alkaa luomisajalla, joten niiden joukko lajittuu luomisjärjestykseen; tämä tekee siitä version, johon kannattaa tarttua, kun tunnisteesta tulee tietokannan avain. Versio 1 on alkuperäinen aikapohjainen järjestelmä, joka on säilytetty täällä sitä edelleen pyytäville järjestelmille. Versiot 3 ja 5 ovat erikoinen pari: ne ovat deterministisiä, mikä tarkoittaa, että samat syötteet tuottavat aina saman tunnisteen, ja ne ottavat kaksi lisäkenttää — «Nimiavaruus», joka on jokin standardiavaruuksista DNS, URL, OID ja X.500 tai sinun «Oma», ja «Nimi», tunnistettava merkkijono. Syötä v5:lle URL-nimiavaruus ja https://example.com/a, niin saat saman UUID:n tänään, huomenna ja jonkun muun koneella. Tästä syystä «Määrä» katoaa, kun v3 tai v5 on valittu: tuhat kopiota yhdestä deterministisestä arvosta olisi tuhat kopiota yhdestä deterministisestä arvosta. Kaikille muille versioille «Määrä» kulkee välillä 1–1000.
Neljä kytkintä muuttaa tulosteen muotoa muuttamatta sen alla olevia 128 bittiä. «Isot kirjaimet» tulostaa heksadesimaalinumerot versaaleina, «Ilman väliviivoja» antaa kompaktin 32-merkkisen muodon, jota jotkin sarakkeet ja tiedostonimet suosivat, ja «Aaltosulkeet» käärii arvon { }-merkkeihin — muoto, jota Windows ja .NET-maailma kutsuvat GUID:ksi. Kohdassa «Lisäasetukset», urn:uuid: lisää etuliitteen, joka tekee siitä virallisen URN:n; se ottaa pois päältä kytkimet «Aaltosulkeet» ja «Ilman väliviivoja» ollessaan päällä, koska standardi sallii täsmälleen yhden URN-muodon ja se on kanoninen väliviivallinen muoto. «Kopiointimuoto» päättää, miten erä yhdistetään kun otat sen: yksi per rivi, pilkuilla erotettuna, tai jokainen arvo lainausmerkeissä päättyen pilkkuun, joka liitetään suoraan koodin taulukkoon. Tuloksen alla on rivi, joka ilmoittaa satunnaisuuden bitteinä — 122 v4:lle, 62 v7:lle — ja v7:n kohdalla erän ensimmäiseen tunnisteeseen koodatun aikaleiman, jotta arvon sisällä oleva aika on näkyvissä eikä vain oletettu. «Kopioi kaikki» ja «Tallenna tiedostoon» kunnioittavat molemmat «Kopiointimuoto»-asetusta. «Historia» säilyttää viimeiset 10 erääsi omassa selaimessasi: klikkaa yhtä palauttaaksesi sen, kopioi tai poista yksittäinen tietue, tai tyhjennä koko luettelo. «Tyhjennä» tyhjentää tuloksen jättäen asetuksesi rauhaan, ja yli 50 tunnisteen jälkeen listasta tulee yksi vieritettävä lohko viidenkymmenen rivin sijaan.
Tämän sivun seurauksellisin asia on ero v4:n ja v7:n välillä ensisijaisena avaimena (primary key), eikä se ole makuasia. Tietokantaindeksit ovat B-tree -puita, joita pidetään lajitellussa järjestyksessä, ja se, mihin uusi avain tässä järjestyksessä laskeutuu, ratkaisee kuinka paljon työtä lisäys maksaa. v4-avain on satunnainen, joten peräkkäiset lisäykset laskeutuvat indeksin toisiinsa liittymättömiin nurkkiin: täydet sivut halkeavat (page split), ne puun osat, joita tietokanta pitää muistissa, ovat harvoin niitä osia, joita seuraava lisäys tarvitsee, ja indeksistä tulee suurempi ja pirstoutuneempi kuin mihin se osoittaa. v7-avain alkaa nykyisellä millisekunnilla, joten peräkkäiset lisäykset laskeutuvat vierekkäin puun oikeanpuoleiseen reunaan, mikä on automaattisesti kasvavan kokonaisluvun tuottama malli ja malli, jonka ympärille indeksirakenteet rakennettiin. Tämä on koko vaihtokauppa: v7 ostaa sinulle peräkkäisen avaimen lisäyskäyttäytymisen, samalla kun se säilyttää ominaisuuden, joka sai sinut alun perin valitsemaan UUID:t, eli sen, että kuka tahansa voi luoda sellaisen kysymättä palvelimelta. Se maksaa sen, että luomisaika on nyt luettavissa tunnisteen sisällä, ja onko sillä väliä, on kysymys tiedoistasi, ei muodosta.
Mikään ei koskaan tarkista UUID:n yksilöllisyyttä; sen koko on tae. Rekisteriä ei ole, palvelinkierrosta ei ole, hakua ei ole — generaattori tuottaa numeron ja luovuttaa sen, ja syy siihen, miksi kaksi niistä ei törmää, on yksinkertaisesti se, että mahdollisia v4-arvoja on 2^122, noin 5,3 sekstiljoonaa. Syntymäpäiväongelma (birthday problem) on rehellinen tapa mitoittaa se: tarvitsisit noin 2,7 triljoonaa tunnistetta ennen kuin olisi 50 prosentin todennäköisyys, että mitkä tahansa kaksi niistä täsmäävät, mikä tekee miljardi uutta UUID:tä joka sekunti 86 vuoden ajan. On syytä olla tarkka siitä, mitä se lupaa ja mitä ei. Se on tilastollinen tae, ei aritmeettinen, ja se pätee vain silloin, kun alla oleva satunnaisuus on aitoa — huonosti alustettu generaattori tai virtuaalikone, joka on kloonattu yhdessä entropia-altaansa kanssa, rikkoo sen tavalla, jota muoto ei pysty havaitsemaan. Versio 7 kaventaa kysymystä edelleen: yhden millisekunnin sisällä yksi generaattori ei voi toistaa itseään lainkaan, koska laskuri kasvaa sen sijaan että heittäisi noppaa, ja riippumattomien generaatorien välillä 62 satunnaista bittiä tekevät työn.
UUID on tunniste, ei salasana. Versio 4 on arvaamaton, ja se houkuttelee ihmisiä käsittelemään sitä salaisuutena — salasanan nollauslinkkinä, arvaamattomana URL:nä, istuntotokenina, API-avaimena. Arvaamattomuus on todellista, mutta salassapito on arvon käsittelyn ominaisuus, ja tunnisteita käsitellään suunnitellusti huolimattomasti: ne istuvat URL-osoitteissa, jotka päätyvät selaimen historiaan, palvelinlokeihin, referrer-otsikoihin ja analytiikkaan, ja niitä liitetään chat-viesteihin. Muut versiot ovat vielä huonompia ehdokkaita. Versio 1 ja versio 7 molemmat koodaavat luomishetken, joten jokainen niitä pitävä tietää suunnilleen, milloin se tehtiin, ja voi kaventaa kaiken sen rinnalla tehdyn naapurustoa. Versiot 3 ja 5 ovat tahallaan deterministisiä: sähköpostiosoitteen v5 UUID ei ole tiivistetty salaisuus, se on arvo, jonka kuka tahansa saman osoitteen omaava voi laskea sekunnissa. Käytä UUID:tä asian nimeämiseen. Käytä salasanageneraattoria tai salaisuuksia varten rakennetun kirjaston tokenia, kun arvon täytyy pysyä tuntemattomana.
Miksi valita tämä UUID-generaattori?
- Vain selaimessa tapahtuva luominen: tunnisteet tehdään laitteellasi eikä niitä koskaan lähetetä minnekään
- Web Crypto API -satunnaisuus: kryptografisesti turvallinen, ei Math.random()
- Viisi versiota yhdessä paikassa: v1, v3, v4, v5 ja v7, ilman työkalujen vaihtamista
- Aidosti järjestetty v7: laskuri millisekunnin sisällä, kuten RFC 9562 kuvaa
- Deterministiset v3 ja v5 neljällä standardinimiavaruudella tai omallasi
- Jopa 1000 kerralla, kompaktilla vieritettävällä listalla viidenkymmenen jälkeen
- Jokainen yleinen muoto: väliviivoilla, paljas, isot kirjaimet, aaltosulkeet tai urn:uuid: URN
- Kopioi riveinä, pilkkuina tai lainausmerkeissä olevina arvoina, jotka liitetään suoraan koodiin
- Rajoittamaton ja ilmainen: ei rekisteröitymistä, ei käyttörajoituksia, ei mitään palvelimillamme
UUID:t ilmaantuvat kaikkialle, missä jotain täytyy nimetä, ennen kuin mikään voi vahvistaa nimen olevan vapaa. Sovelluskoodi lyö niitä riveille, joita se on aikeissa lisätä, joten objektilla on identiteetti jo ennen kuin se on edes saavuttanut tietokantaa, ja asiakas voi viitata siihen kirjoutuksen ollessa yhä käynnissä. Hajautetut järjestelmät nojaavat niihin kovemmin: useat palvelut kirjoittavat samaan tauluun, offline-tilassa oleva mobiiliasiakas lentokoneessa, jono, jonka on tunnistettava viesti, jonka se on jo käsitellyt — yksikään näistä ei voi odottaa vuoroaan jaettua laskuria varten. Versio 5 kattaa toisenlaisen tarpeen, joka on vakaa tunniste johdettuna jostain, mitä sinulla jo on: sama asiakirja, sama URL-osoite tai sama tili yhdistyy aina samaan UUID:hen, joten tuonti voidaan ajaa kahdesti duplikoimatta mitään. Muualla ne ovat yksinkertaisesti järjestelmän vaatima muoto — valtionhallinnon tietojärjestelmä (kuten Suomi.fi), joka käsittelee tapahtumia lokeista, pankki Helsingissä, joka kokoaa asiakastietoja, televiestintäyrityksen järjestelmä, joka jäljittää puheluita, tai Windows-rekisteriavain, testidata, jonka täytyy näyttää aidolta.
Muutama rehellinen raja on syytä tietää. Yksi erä on yksi versio: «Versio»-kentän arvo koskee kaikkea siinä, joten v4-ajo ja v7-ajo ovat kaksi erää. Tämä on generaattori, ei tarkastaja — UUID:n liittäminen sen version tai aikaleiman lukemiseksi takaisin ei ole jotain, mitä tämä sivu tekee. «Tallenna tiedostoon» kirjoittaa tavallisen tekstitiedoston CSV:n tai JSON:n sijaan. Versio 7 paljastaa avoimesti milloin se luotiin, millisekunnin tarkkuudella, mikä on todellinen kompromissi eikä virhe, ja versio 1 vuotaa aikaa samalla tavalla; jos se on ongelma tiedoillesi, versio 4 on versio, joka ei kerro kenellekään mitään. Kaksi standardin erikoisarvoa eivät ole versioita eivätkä siksi vaihtoehtoja kohdassa «Versio», mutta voit kopioida ne täältä: nil UUID, 00000000-0000-0000-0000-000000000000, ja max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Kaikki tällä sivulla noudattaa RFC 9562:ta, määritystä joka korvasi RFC 4122:n vuonna 2024, joten tulosteen hyväksyy mikä tahansa kirjasto, tietokanta tai API, joka käsittelee UUID:itä ylipäänsä. Näiden rajojen sisällä tae on vahva: jokainen tunniste on rakennettu standardin mukaisesti, kryptografisesti turvallisesta satunnaisuudesta, omalla koneellasi, eikä kukaan muu koskaan näe sitä.