Har du brug for en identifikator, der ikke støder sammen med en, som en anden har lavet, på en maskine, du aldrig har hørt om, uden at bede nogen om tilladelse? Det er præcis den opgave, en UUID løser. Det er et 128-bit tal, der skrives som 36 tegn i det velkendte 8-4-4-4-12-mønster, og hele dets design går ud på, at to af dem ikke vil være ens, selvom intet koordinerer, hvem der får hvilken. Denne gratis generator laver dem i din browser: vælg en version i Version, angiv hvor mange du har brug for i Antal, og tryk på Generér. Siden åbner med en enkelt v4, som er den version, de fleste projekter ønsker, så den første identifikator er kun et klik væk.
Hver identifikator bygges af din browser gennem Web Crypto API. Version 4 bruger crypto.randomUUID(), hvor browseren understøtter det, og crypto.getRandomValues() ellers — en kryptografisk stærk kilde til tilfældighed frem for en JavaScript-pseudotilfældig funktion som Math.random(). Version 7 placerer et 48-bit millisekund-tidsstempel i starten, derefter en 12-bit tæller, der tæller op inden for det samme millisekund, efterfulgt af 62 tilfældige bits, hvilket er den sorteringsmetode, der er beskrevet i RFC 9562; denne tæller er grunden til, at et parti på tusind kommer ud i rækkefølge i stedet for blandet. Version 1 kombinerer et tidsstempel med en tilfældig nodeidentifikator, der har multicast-bitten sat, så den bærer aldrig dit netværkskorts adresse, som de oprindelige 1990'er-implementeringer gjorde. Version 3 og 5 er slet ikke tilfældige: de hasher et namespace sammen med et navn ved hjælp af henholdsvis MD5 og SHA-1, og denne hashing sker også på din enhed. Intet sendes til en server, intet logges, og når siden først er indlæst, fortsætter den med at fungere uden internetforbindelse.
Version er det felt, der bestemmer alt andet. Version 4 er 122 tilfældige bits og ingen struktur — standardvalget og det rigtige svar, når en identifikator kun skal være unik. Version 7 beholder 62 tilfældige bits, men starter med det tidspunkt, den blev oprettet på, så et sæt af dem sorteres i den rækkefølge, de blev lavet; det er det, der gør den til versionen, du skal gribe ud efter, når identifikatoren skal være en databasenøgle. Version 1 er den oprindelige tidsbaserede ordning, beholdt her for systemer, der stadig beder om den. Version 3 og 5 er det skæve par: de er deterministiske, hvilket betyder, at de samme input altid producerer den samme identifikator, og de tager to ekstra felter — Namespace, som er et af standardrummene DNS, URL, OID og X.500 eller dit eget (Brugerdefineret namespace (UUID)), og Navn, den streng der identificeres. Giv v5 URL-namespacet og https://example.com/a, og du får den samme UUID i dag, i morgen og på en andens maskine. På grund af dette forsvinder feltet Antal, når v3 eller v5 vælges: tusind kopier af én deterministisk værdi ville blot være tusind kopier af én deterministisk værdi. For alle andre versioner går Antal fra 1 til 1000.
Fire kontakter ændrer outputtets form uden at ændre de 128 bits nedenunder. Store bogstaver udskriver de hexadecimale cifre med versaler, Uden bindestreger giver den kompakte 32-tegns form, som nogle kolonner og filnavne foretrækker, og Krøllede parenteser pakker værdien ind i tuborgklammer — den form, som Windows og .NET-verdenen kalder en GUID. Under Avancerede indstillinger tilføjer urn:uuid: det præfiks, der gør det til en formel URN; det slår Krøllede parenteser og Uden bindestreger fra, mens det er slået til, fordi standarden tillader præcis én URN-form, og det er den kanoniske med bindestreger. Kopiformat bestemmer, hvordan et parti sættes sammen, når du tager det: én pr. linje, adskilt af kommaer, eller hver værdi i anførselstegn med et afsluttende komma, som kan indsættes direkte i et array i kode. Under resultatet sidder en linje, der rapporterer tilfældigheden i bits — 122 for v4, 62 for v7 — og for v7, det tidsstempel, der er kodet ind i den første identifikator i partiet, så tiden inde i værdien er synlig snarere end underforstået. Kopiér alt og Gem som fil respekterer begge Kopiformat. Historik gemmer dine seneste 10 partier i din egen browser: klik på et for at hente det tilbage, kopiér eller slet en enkelt post, eller ryd det hele. Ryd tømmer resultatet og lader dine indstillinger være i fred, og efter 50 identifikatorer bliver listen til én rulbar blok i stedet for halvtreds rækker.
Det mest betydningsfulde på denne side er forskellen mellem v4 og v7 som en primærnøgle (primary key), og det er ikke et spørgsmål om smag. Databaseindekser er B-tree-strukturer holdt i sorteret rækkefølge, og hvor en ny nøgle lander i den rækkefølge, bestemmer, hvor meget arbejde indsættelsen koster. En v4-nøgle er tilfældig, så på hinanden følgende indsættelser lander i urelaterede hjørner af indekset: sider, der var fulde, bliver delt (page split), de dele af træet, som databasen holder i hukommelsen, er sjældent de dele, som den næste indsættelse har brug for, og indekset ender med at blive større og mere fragmenteret, end de rækker, det peger på, retfærdiggør. En v7-nøgle starter med det aktuelle millisekund, så på hinanden følgende indsættelser lander ved siden af hinanden i den højre kant af træet, hvilket er det mønster, et auto-inkrementerende heltal producerer, og det mønster, indeksstrukturer blev bygget omkring. Det er hele byttehandlen: v7 køber dig indsættelsesadfærden fra en sekventiel nøgle, mens du beholder den egenskab, der fik dig til at vælge UUIDs i første omgang, nemlig at enhver kan udstede en uden at spørge en server. Det, det koster, er, at oprettelsestidspunktet nu kan læses inde i identifikatoren, og om det betyder noget, er et spørgsmål om dine data, ikke om formatet.
Intet tjekker nogensinde en UUID for unikhed; dens størrelse er garantien. Der er intet register, intet serveropslag, ingen søgning — en generator producerer et tal og afleverer det, og grunden til, at to af dem ikke kolliderer, er simpelthen, at der er 2^122 mulige v4-værdier, cirka 5,3 sekstillioner. Fødselsdagsparadokset (birthday problem) er den ærlige måde at vurdere dette på: du ville have brug for cirka 2,7 trillioner identifikatorer, før der var en halvtreds-halvtreds chance for, at to af dem var ens, hvilket svarer til en milliard nye UUIDs i sekundet i 86 år. Det er værd at være præcis om, hvad det lover, og hvad det ikke lover. Det er en statistisk garanti, ikke en aritmetisk en, og den holder kun, mens den underliggende tilfældighed er ægte — en generator, der er dårligt seedet, eller en virtuel maskine, der er klonet sammen med sin entropipulje, bryder den på en måde, formatet ikke kan opdage. Version 7 indsnævrer spørgsmålet yderligere: inden for et enkelt millisekund kan én generator slet ikke gentage sig selv, fordi tælleren tæller op i stedet for at slå med terninger, og på tværs af uafhængige generatorer gør de 62 tilfældige bits arbejdet.
En UUID er en identifikator, ikke en adgangskode. Version 4 er uforudsigelig, og det frister folk til at behandle den som en hemmelighed — et link til nulstilling af adgangskode, en uigennemskuelig URL, en sessionstoken, en API-nøgle. Uforudsigeligheden er ægte, men hemmeligholdelse er en egenskab ved, hvordan en værdi håndteres, og identifikatorer håndteres skødesløst af design: de sidder i URL'er, som lander i browserhistorik, serverlogs, referrer-headere og analyser, og bliver indsat i chatbeskeder. De andre versioner er endnu dårligere kandidater. Version 1 og version 7 koder begge skabelsesøjeblikket, så enhver, der har en, ved cirka, hvornår den blev lavet, og kan indsnævre nabolaget af alt, hvad der blev lavet ved siden af den. Version 3 og 5 er deterministiske med vilje: en v5 UUID af en e-mailadresse er ikke en hashet hemmelighed, det er en værdi, enhver med den samme adresse kan beregne på et sekund. Brug en UUID til at navngive en ting. Brug en adgangskodegenerator, eller en token fra et bibliotek bygget til hemmeligheder, når værdien skal forblive ukendt.
Hvorfor vælge denne UUID-generator?
- Generering kun i browseren: identifikatorer laves på din enhed og sendes aldrig nogen steder hen
- Web Crypto API-tilfældighed: kryptografisk sikker, ikke Math.random()
- Fem versioner på ét sted: v1, v3, v4, v5 og v7, uden at skifte værktøjer
- Ægte sorteret v7: en tæller inden i millisekundet, som RFC 9562 beskriver
- Deterministisk v3 og v5 med de fire standard-namespaces eller dit eget
- Op til 1000 ad gangen, med en kompakt rulbar liste efter halvtreds
- Hver almindelig form: med bindestreg, bar, store bogstaver, i parentes eller en urn:uuid: URN
- Kopiér som linjer, kommaer eller værdier i anførselstegn, der kan indsættes direkte i kode
- Ubegrænset og gratis: ingen tilmelding, ingen brugsgrænser, intet på vores servere
UUIDs dukker op, hvor end noget skal navngives, før noget andet kan bekræfte, at navnet er ledigt. Applikationskode udsteder dem for rækker, den er ved at indsætte, så objektet har en identitet, før det nogensinde har nået databasen, og en klient kan referere til det, mens skrivningen stadig er undervejs. Distribuerede systemer læner sig hårdere op ad dem: flere tjenester, der skriver til én tabel, en offline mobilklient, der opretter poster på et fly, en kø, der skal genkende den besked, den allerede har behandlet — ingen af disse kan vente på deres tur til en delt tæller. Version 5 dækker et andet behov, som er en stabil identifikator afledt af noget, du allerede har: det samme dokument, den samme URL eller den samme konto mappes altid til den samme UUID, så en import kan køre to gange uden at duplikere noget. Andre steder er de simpelthen det format, et system kræver — en korrelationsidentifikator ført gennem logs og traces, et filnavn, der ikke vil kollidere, når uploads fra tusind brugere lander i én spand, en Windows-registreringsnøgle, et testobjekt (test fixture), der skal ligne rigtige data.
Der er et par ærlige grænser, der er værd at kende. Ét parti er én version: værdien i Version gælder for alt i det, så en kørsel af v4'ere og en kørsel af v7'ere er to partier. Dette er en generator, ikke en inspektør — at indsætte en UUID for at læse dens version eller tidsstempel tilbage er ikke noget, denne side gør. Gem som fil skriver en almindelig tekstfil snarere end CSV eller JSON. Version 7 afslører åbent, hvornår den blev oprettet, ned til millisekundet, hvilket er en reel byttehandel frem for en fejl, og version 1 lækker tid på samme måde; hvis det er et problem for dine data, er version 4 den version, der ikke fortæller nogen noget. To specielle værdier fra standarden er ikke versioner og er derfor ikke muligheder i Version, men du kan kopiere dem herfra: nil UUID, 00000000-0000-0000-0000-000000000000, og max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Alt på denne side følger RFC 9562, specifikationen, der erstattede RFC 4122 i 2024, så outputtet accepteres af ethvert bibliotek, database eller API, der overhovedet håndterer UUIDs. Inden for disse grænser er garantien stærk: hver identifikator er bygget efter standarden, fra kryptografisk sikker tilfældighed, på din egen maskine, og ingen andre ser den nogensinde.