UUID-generator

Generér UUIDs i din browser: fuldt tilfældig v4, tidssorteret v7 til database-nøgler, eller deterministisk v5 ud fra et namespace og et navn. Op til 1000 ad gangen, og intet forlader din enhed.

Tryk på Generér for at få resultatet
Version
Avancerede indstillinger

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?

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.

FAQ

Hvordan genererer jeg en UUID?

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 version 4-identifikator, hvilket er, hvad de fleste projekter ønsker, så en almindelig UUID er kun ét klik væk. Hver værdi vises med sin egen kopieringsknap, og Kopiér alt tager hele partiet på én gang.

Hvad er forskellen mellem UUID v4 og v7?

Version 4 er 122 tilfældige bits uden nogen struktur overhovedet, så to af dem har intet forhold til hinanden. Version 7 bruger de første 48 bits på det millisekund, den blev oprettet, tilføjer en tæller og 62 tilfældige bits, og kan derfor sorteres: et parti kommer ud i den rækkefølge, det blev lavet. Brug v4, når en identifikator kun skal være unik, og v7, når den også skal være en databasenøgle.

Hvilken UUID-version skal jeg bruge?

Version 4, medmindre du har en grund til at vælge en anden. Vælg version 7, hvis identifikatoren bliver en primærnøgle og indsættelsesydelse betyder noget, version 5, hvis du har brug for, at det samme input altid producerer den samme identifikator, og version 1, kun hvis et system, du skal tale med, specifikt beder om det. Version 3 er version 5 med MD5 i stedet for SHA-1 og eksisterer af hensyn til kompatibilitet.

Er de genererede UUIDs virkelig tilfældige og sikre?

Tilfældigheden er kryptografisk sikker: den kommer fra din browsers Web Crypto API gennem crypto.randomUUID() eller crypto.getRandomValues(), ikke fra Math.random(). Sikker i betydningen "uforudsigelig" er et andet spørgsmål end sikker i betydningen "hemmelig" — en UUID er en identifikator og bør ikke bruges som en adgangskode, en sessionstoken eller en API-nøgle.

Kan jeg generere mange UUIDs på én gang?

Ja, op til 1000 ad gangen. Indstil Antal og tryk på Generér; efter halvtreds værdier bliver resultatet en enkelt rulbar blok i stedet for en lang liste af rækker. Kopiér alt og Gem som fil tager hele partiet, sat sammen på den måde, Kopiformat angiver — én pr. linje, adskilt af kommaer eller i anførselstegn til indsættelse i et array.

Hvorfor giver v3 og v5 mig den samme UUID hver gang?

Fordi det er det, de er til for. Version 3 og 5 er deterministiske: de hasher det namespace og det navn, du giver dem, så identiske input producerer altid en identisk identifikator, på enhver maskine og i ethvert sprog. Det gør dem nyttige til at udlede en stabil identifikator fra noget, du allerede har, og det er også grunden til, at Antal skjules, når du vælger dem.

Hvad er Namespace og Navn, og hvilket namespace skal jeg vælge?

Det er de to input, en version 3 eller version 5 UUID beregnes ud fra. Namespace angiver, hvilken slags ting navnet er — DNS for værtsnavne, URL for adresser, OID og X.500 for disse biblioteksordninger, eller Brugerdefineret namespace (UUID), hvis du ønsker at angive din egen namespace-UUID, hvilket er det sædvanlige valg i en applikation. Navn er selve strengen. Forskellige namespaces giver helt forskellige resultater for det samme navn, hvilket er formålet med at have dem.

Hvorfor er UUID v7 bedre end v4 til en database-primærnøgle?

På grund af hvor værdierne lander i indekset. Et indeks holdes i sorteret rækkefølge, og en tilfældig v4-nøgle lander hvor som helst i det, så indsættelser deler sider (page split) overalt i træet, og de dele, der holdes i hukommelsen, er sjældent de dele, der skal bruges næste gang. En v7-nøgle starter med det aktuelle millisekund, så på hinanden følgende indsættelser lander samlet i slutningen af indekset, hvilket er, hvordan en sekventiel heltalsnøgle opfører sig — mens det stadig lader enhver tjeneste udstede en identifikator uden at spørge en central tæller.

Kan to UUIDs nogensinde være de samme?

I princippet ja, i praksis nej, og det er værd at vide hvorfor. Intet verificerer unikhed: der er simpelthen 2^122 mulige version 4-værdier, cirka 5,3 sekstillioner, og du ville have brug for cirka 2,7 trillioner af dem — en milliard i sekundet i 86 år — før der var en halvtreds-halvtreds chance for en enkelt kollision. Garantien er statistisk snarere end absolut, og den afhænger af, at tilfældigheden er ægte, hvilket er grunden til, at denne generator bruger Web Crypto API i stedet for en almindelig pseudotilfældig funktion.

Kan jeg bruge en UUID som en adgangskode, en API-nøgle eller en sessionstoken?

Nej, og dette er fejlen, der koster mest. En version 4 UUID er uforudsigelig, men identifikatorer håndteres, som om de er offentlige: de ender i URL'er, browserhistorik, serverlogs, referrer-headere og analyser. Version 1 og 7 afslører desuden, hvornår de blev oprettet, og version 3 og 5 kan genberegnes af enhver, der kender inputtene. Til alt, der skal forblive hemmeligt, skal du bruge en adgangskodegenerator eller en token fra et bibliotek beregnet til hemmeligheder.

Afslører UUID v7, hvornår den blev oprettet?

Ja, ned til millisekundet, og det er med vilje og ikke en forglemmelse — tidsstemplet er det, der gør v7 sorterbar. Linjen under resultatet viser dig den tid, der er kodet ind i den første værdi i partiet, så du kan se præcis, hvad der afsløres. Version 1 bærer også et tidsstempel. Hvis oprettelsestidspunktet er noget, du hellere ikke vil publicere, indeholder version 4 slet ingen tid.

Afslører UUID v1 min MAC-adresse?

Ikke her. Den oprindelige ordning brugte maskinens netværkskortadresse som nodefeltet, hvilket er der, v1's ry kommer fra, men standarden tillader også en tilfældig nodeidentifikator markeret med multicast-bitten, og det er, hvad denne generator producerer. Din hardwareadresse bliver aldrig læst og dukker aldrig op i outputtet.

Hvad ændrer Store bogstaver, Uden bindestreger, Krøllede parenteser og urn:uuid:?

Kun præsentationen — de 128 bits nedenunder er identiske i enhver form. Store bogstaver udskriver hex-cifrene med versaler, Uden bindestreger giver den kompakte 32-tegns version, Krøllede parenteser pakker værdien ind i tuborgklammer, som Windows og .NET skriver en GUID, og urn:uuid: tilføjer det præfiks, der gør det til en formel URN. urn:uuid: slår de to andre fra, mens den er slået til, fordi standarden definerer præcis én URN-form, og det er den kanoniske form med bindestreger.