KSUID Generator - Opprett Sorterbare Unike Identifikatorer
Generer K-Sorterbare Unike Identifikatorer (KSUIDs) på nettet. Opprett tidssortérbare, kollisjonsresistente ID-er for distribuerte systemer og databaser umiddelbart.
KSUID-generator
Dokumentasjon
Generator for KSUID
En KSUID (K-Sortable Unique Identifier) er en kode på 27 tegn som brukes til å merke poster som databaserekker, loggoppføringer eller API-forespørsler. Den kombinerer et tidsstempel med tilfeldige data, slik at ID-er som lages senere, alltid sorteres etter ID-er som ble laget tidligere, selv om hver av dem fortsatt i praksis er unik. Dette verktøyet genererer én enkelt KSUID i nettleseren og lar brukeren kopiere den.
Hva består en KSUID av?
En KSUID er 20 byte lang og delt inn i to deler:
- Tidsstempel (4 byte): antallet sekunder siden et fast startpunkt kalt KSUID-epoken.
- Tilfeldig nyttelast (16 byte): data produsert av nettleserens kryptografiske generator for tilfeldige tall.
Disse 20 bytene konverteres deretter til tekst ved hjelp av base62-koding, et system som representerer tall med 62 tegn: sifrene 0-9, de store bokstavene A-Z og de små bokstavene a-z. Resultatet fylles alltid ut til nøyaktig 27 tegn, for eksempel 0qjBBlJIfbVLKwnJn4xpLGDr00e.
Fordi tidsstempelet kommer først, vil to KSUID-er som er laget med ett sekunds mellomrom, normalt sorteres i samme rekkefølge som opprettelsestidspunktene når de sammenlignes som ren tekst. Fordi de siste 16 bytene er tilfeldige, er det fortsatt nesten sikkert at to KSUID-er som lages i samme sekund, blir forskjellige.
KSUID-epoken
De fleste datasystemer teller tid i sekunder siden 1. januar 1970 («Unix-epoken»). KSUID-er bruker et annet startpunkt, KSUID-epoken: 1 400 000 000 sekunder etter Unix-epoken, som er 13. mai 2014, 16:53:20 UTC.
Et senere startpunkt gjør at tidsstempelfeltet på 4 byte kan dekke flere nyttige år før det går tomt for plass. En teller på 4 byte (32 bit) kan inneholde maksimalt 4 294 967 295 sekunder. Med telling fra KSUID-epoken tar denne tidsperioden slutt rundt 19. juni 2150.
KSUID-formelen
En KSUID-streng bygges i tre trinn.
-
Finn tidsstempelverdien:
T = floor(current_unix_time_in_seconds) − 1,400,000,000 -
Generer 16 tilfeldige byte,
R, ved hjelp av en kryptografisk sikker generator for tilfeldige tall. -
Sett tidsstempelet på 4 byte og de 16 tilfeldige bytene sammen til én blokk på 20 byte, og kod deretter blokken i base62. Fyll resultatet ut til 27 tegn:
KSUID = Base62( T ‖ R )
Her betyr ‖ «plasser den ene etter den andre». Tidsstempelbytene kommer alltid først, og det er dette som gjør at den endelige strengen sorteres riktig etter tid.
Regneeksempel
Anta at tidsstempeldelen av en KSUID er 100000000. Siden KSUID-epoken er 1 400 000 000 sekunder etter Unix-epoken, representerer dette tidsstempelet 14. juli 2017, 02:40:00 UTC.
Koble dette tidsstempelet sammen med bytesekvensen på 16 byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 (brukt her bare for å gjøre eksempelet reproduserbart; en ekte generator bruker tilfeldige byte), så gir base62-kodingen:
0qjBBlJIfbVLKwnJn4xpLGDr00e
Denne strengen er 27 tegn lang, består bare av sifre og bokstaver og kan brukes direkte i en URL eller et filnavn.
Slik bruker du KSUID-generatorverktøyet
- Åpne siden for KSUID-generatoren.
- Velg knappen «Generate KSUID».
- Verktøyet oppretter én ny KSUID ved hjelp av gjeldende tid og nye tilfeldige byte, og viser den på siden.
- Velg knappen «Copy KSUID» for å kopiere verdien til utklippstavlen.
- Velg «Reset» for å tømme resultatet. Tilbakestillingsknappen vises bare etter at en KSUID er generert.
Hvert klikk på «Generate KSUID» produserer nøyaktig én identifikator. For å opprette flere KSUID-er klikker du på knappen på nytt for hver nye identifikator; verktøyet har ingen innebygd batchmodus eller fileksport.
Generatoren bruker Web Crypto API-et som er innebygd i moderne nettlesere. Hvis dette API-et ikke er tilgjengelig, viser verktøyet en feil i stedet for å produsere en ID, fordi en generator for tilfeldige tall som ikke er kryptografisk sikker, kan produsere identifikatorer som er lettere å gjette eller som kolliderer.
KSUID sammenlignet med UUID
En UUID (Universally Unique Identifier) er et vanlig alternativt identifikatorformat. Den mest utbredte versjonen, UUID v4, er 36 tegn lang og består nesten utelukkende av tilfeldige biter, så to UUID-er gir ingen indikasjon på hvilken som ble opprettet først.
En KSUID skiller seg fra dette på tre måter:
- Kan sorteres etter tid. De innledende tidsstempelbytene gjør at alfabetisk sortering av KSUID-strenger også sorterer dem etter opprettelsestidspunkt.
- Kortere. En KSUID er på 27 tegn, sammenlignet med 36 for en standard-UUID.
- Ingen skilletegn. En UUID skrives vanligvis med bindestreker (
xxxxxxxx-xxxx-...), mens en KSUID ikke har noen.
Begge formatene kan genereres uavhengig på forskjellige datamaskiner uten å kontrollere med en sentral server, så begge unngår flaskehalsen som en automatisk inkrementert teller i en delt database utgjør.
Ofte stilte spørsmål
Hva står KSUID for? K-Sortable Unique Identifier. «K-en» viser til at identifikatoren kan sorteres («kind of sortable» i de opprinnelige designnotatene fra Segment, selskapet som opprettet formatet).
Hvor lang er en KSUID? 27 tegn, kodet med base62 (sifrene 0-9, store bokstaver og små bokstaver).
Hva er KSUID-epoken? 13. mai 2014, 16:53:20 UTC, som er 1 400 000 000 sekunder etter standard Unix-epoke, 1. januar 1970.
Kan to KSUID-er kollidere? Det er ekstremt usannsynlig. Hver KSUID inneholder 16 tilfeldige byte (128 bit), generert med en kryptografisk sikker tilfeldighetstallgenerator. Selv om mange KSUID-er genereres i samme sekund, er sannsynligheten for at to tilfeldigvis blir like, astronomisk liten.
Kan jeg finne opprettelsestidspunktet fra en KSUID? Ja. De første 4 bytene i den dekodede verdien er tidsstempelet. Når dette antallet sekunder legges til KSUID-epoken, får man det opprinnelige opprettelsestidspunktet.
Støtter dette verktøyet generering av mange KSUID-er samtidig? Nei. Verktøyet genererer én KSUID per klikk på knappen «Generate KSUID». Det finnes ikke noe felt for antall, felt for egendefinert tidsstempel eller funksjon for eksport/nedlasting.
Er det trygt å plassere en KSUID i en URL? Ja. Base62-koding bruker bare sifre og bokstaver, så en KSUID trenger ingen ekstra escaping for å brukes i en URL, et filnavn eller en databasenøkkel.
Referanser
- Segment sitt KSUID GitHub-repositorium: https://github.com/segmentio/ksuid
- "Generating good unique identifiers" av Peter Bourgon: https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html