KSUID Generator - Opret Sorterbare Entydige Identifikatorer
Generer K-Sorterbare Entydige Identifikatorer (KSUIDs) online. Opret tidssortérbare, kollisionsresistente ID'er til distribuerede systemer og databaser øjeblikkeligt.
KSUID-generator
Dokumentation
KSUID-generator
En KSUID (K-Sortable Unique Identifier) er en kode på 27 tegn, der bruges til at mærke poster som databaserækker, logposter eller API-anmodninger. Den kombinerer et tidsstempel med tilfældige data, så id'er, der oprettes senere, altid sorteres efter id'er, der blev oprettet tidligere, selv om hvert id stadig i praksis er unikt. Dette værktøj genererer en enkelt KSUID i browseren og lader brugeren kopiere den.
Hvad består en KSUID af?
En KSUID er 20 bytes lang og opdelt i to dele:
- Tidsstempel (4 bytes): antallet af sekunder siden et fast starttidspunkt kaldet KSUID-epoken.
- Tilfældig nyttelast (16 bytes): data, der genereres af browserens kryptografiske generator til tilfældige tal.
De 20 bytes konverteres derefter til tekst ved hjælp af base62-kodning, et system, der repræsenterer tal med 62 tegn: cifrene 0-9, de store bogstaver A-Z og de små bogstaver a-z. Resultatet udfyldes altid til præcis 27 tegn, for eksempel 0qjBBlJIfbVLKwnJn4xpLGDr00e.
Fordi tidsstemplet kommer først, vil to KSUID'er, der er oprettet med et sekunds mellemrum, normalt blive sorteret i samme rækkefølge som deres oprettelsestidspunkter, når de sammenlignes som almindelig tekst. Fordi de sidste 16 bytes er tilfældige, er to KSUID'er, der oprettes i samme sekund, næsten med sikkerhed forskellige.
KSUID-epoken
De fleste computersystemer tæller tiden i sekunder siden 1. januar 1970 (”Unix-epoken”). KSUID'er bruger et andet starttidspunkt, KSUID-epoken: 1.400.000.000 sekunder efter Unix-epoken, hvilket er 13. maj 2014 kl. 16:53:20 UTC.
Et senere starttidspunkt gør det muligt for tidsstempelfeltet på 4 bytes at dække flere nyttige år, før det løber tør for plads. En tæller på 4 bytes (32 bit) kan højst indeholde 4.294.967.295 sekunder. Talt fra KSUID-epoken udløber dette tidsrum omkring 19. juni 2150.
KSUID-formel
En KSUID-streng opbygges i tre trin.
-
Find tidsstemplets værdi:
T = floor(current_unix_time_in_seconds) − 1,400,000,000 -
Generer 16 tilfældige bytes,
R, ved hjælp af en kryptografisk sikker generator til tilfældige tal. -
Sammensæt tidsstemplet på 4 bytes og de 16 tilfældige bytes til én blok på 20 bytes, og kod derefter blokken i base62, så resultatet udfyldes til 27 tegn:
KSUID = Base62( T ‖ R )
Her betyder ‖ ”placér den ene efter den anden”. Tidsstemplets bytes kommer altid først, og det er det, der får den endelige streng til at sortere korrekt efter tid.
Regneeksempel
Antag, at tidsstempeldelen af en KSUID er 100000000. Da KSUID-epoken ligger 1.400.000.000 sekunder efter Unix-epoken, repræsenterer dette tidsstempel 14. juli 2017 kl. 02:40:00 UTC.
Kombinér dette tidsstempel med bytesekvensen på 16 bytes 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 (som kun bruges her for at gøre eksemplet reproducerbart; en rigtig generator bruger tilfældige bytes), hvorefter base62-kodningen giver:
0qjBBlJIfbVLKwnJn4xpLGDr00e
Strengen er 27 tegn lang, består kun af cifre og bogstaver og kan bruges direkte i en URL eller et filnavn.
Sådan bruges KSUID-generatorværktøjet
- Åbn siden med KSUID-generatoren.
- Vælg knappen ”Generer KSUID”.
- Værktøjet opretter én ny KSUID ved hjælp af det aktuelle klokkeslæt og nye tilfældige bytes og viser den på siden.
- Vælg knappen ”Kopiér KSUID” for at kopiere værdien til udklipsholderen.
- Vælg ”Nulstil” for at rydde resultatet. Knappen ”Nulstil” vises kun, efter at en KSUID er blevet genereret.
Hvert klik på ”Generer KSUID” opretter præcis én identifikator. Hvis der skal oprettes flere KSUID'er, klikkes der på knappen igen for hver ny identifikator; værktøjet har ingen indbygget batchtilstand eller fileksport.
Generatoren benytter Web Crypto API'et, som er indbygget i moderne browsere. Hvis API'et ikke er tilgængeligt, viser værktøjet en fejl i stedet for at oprette et id, fordi en generator til tilfældige tal, der ikke er kryptografisk sikker, kan producere identifikatorer, som er lettere at gætte, eller som kolliderer.
KSUID sammenlignet med UUID
En UUID (Universally Unique Identifier) er et almindeligt alternativt identifikatorformat. Den mest udbredte version, UUID v4, er 36 tegn lang og består næsten udelukkende af tilfældige bit, så to UUID'er ikke giver nogen indikation af, hvilken der blev oprettet først.
En KSUID adskiller sig på tre måder:
- Kan sorteres efter tid. De indledende tidsstempelbytes betyder, at alfabetisk sortering af KSUID-strenge også sorterer dem efter oprettelsestidspunkt.
- Kortere. En KSUID er 27 tegn lang sammenlignet med 36 for en standard-UUID.
- Ingen separatorer. En UUID skrives normalt med bindestreger (
xxxxxxxx-xxxx-...); en KSUID har ingen.
Begge formater kan genereres uafhængigt på forskellige computere uden kontakt til en central server, så begge undgår flaskehalsen ved en tæller med automatisk inkrementering i en delt database.
Ofte stillede spørgsmål
Hvad står KSUID for? K-Sortable Unique Identifier. ”K” henviser til, at den kan sorteres (”kind of sortable” i de oprindelige designnoter fra Segment, virksomheden, der skabte formatet).
Hvor lang er en KSUID? 27 tegn, kodet med base62 (cifrene 0-9, store bogstaver og små bogstaver).
Hvad er KSUID-epoken? 13. maj 2014 kl. 16:53:20 UTC, hvilket er 1.400.000.000 sekunder efter standard-Unix-epoken 1. januar 1970.
Kan to KSUID'er kollidere? Det er ekstremt usandsynligt. Hver KSUID indeholder 16 tilfældige bytes (128 bit), der genereres med en kryptografisk sikker generator til tilfældige tal. Selv hvis der genereres mange KSUID'er i samme sekund, er sandsynligheden for, at to tilfældigvis matcher, astronomisk lille.
Kan oprettelsestidspunktet gendannes fra en KSUID? Ja. De første 4 bytes af den afkodede værdi er tidsstemplet. Hvis dette antal sekunder lægges til KSUID-epoken, fås det oprindelige oprettelsestidspunkt.
Understøtter dette værktøj generering af mange KSUID'er på én gang? Nej. Værktøjet genererer én KSUID pr. klik på knappen ”Generer KSUID”. Der findes ikke noget felt til angivelse af antal, et brugerdefineret tidsstempelfelt eller en eksport-/downloadfunktion.
Er det sikkert at placere en KSUID i en URL? Ja. Base62-kodning bruger kun cifre og bogstaver, så en KSUID kræver ingen ekstra escape-tegn for at kunne indgå i en URL, et filnavn eller en databasenøgle.
Referencer
- Segment's KSUID GitHub-lager: https://github.com/segmentio/ksuid
- "Generating good unique identifiers" af Peter Bourgon: https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html