Hoppa till innehåll

Snowflake ID-generator - Skapa unika distribuerade ID:n

Gratis Snowflake ID-generator och parser. Generera unika 64-bitars ID:n för distribuerade system. Analysera befintliga ID:n för att extrahera tidsstämpel, maskin-ID och sekvens.

Snowflake ID-generator

Valfritt: Unix-tidsstämpel i millisekunder (standard är aktuell tid)

Maskin-ID (0-31)

Datacenter-ID (0-31)

Sekvensnummer (0-4095)

Snowflake ID
2094810865726390272
00111010001001001000011011000100011001101
00000
00000
000000000000
Tidsstämpel (41 bitar)
Datacenter-ID (5 bitar)
Maskin-ID (5 bitar)
Sekvensnummer (12 bitar)
Laddningsberäknare...
📚

Dokumentation

Vad är en Snowflake ID-generator?

En Snowflake ID-generator skapar ett unikt 64-bitars tal från en tidsstämpel, en maskinidentifierare och ett sekvensnummer. Twitter skapade formatet 2010 för att ge varje tweet en identifierare som många servrar kunde skapa samtidigt utan att någonsin behöva fråga varandra ”har det här numret redan använts?”. Det här verktyget skapar ett Snowflake-ID från de angivna värdena och visar hur värdena fyller de 64 bitarna.

Så fungerar denna Snowflake ID-generator

Generatorn tar emot fyra indata:

  • Tidsstämpel: en Unix-tidsstämpel i millisekunder. Lämna fältet tomt för att använda den aktuella tiden.
  • Maskin-ID: ett heltal från 0 till 31 (5 bitar). Detta är Twitters ursprungliga ”worker ID”.
  • Datacenter-ID: ett heltal från 0 till 31 (5 bitar).
  • Sekvensnummer: ett heltal från 0 till 4095 (12 bitar), som används för att skilja ID:n som skapats under samma millisekund åt.

Verktyget kombinerar de fyra värdena till ett 64-bitars ID. Därefter visas resultatet binärt, uppdelat i segment för tidsstämpel, datacenter, maskin och sekvens.

Tidsstämpeln mäts från en fast startpunkt som kallas Twitter-epoken: 4 november 2010, 1:42:54,657 UTC, eller 1 288 834 974 657 millisekunder efter Unix-epoken. Den här generatorn låter inte startpunkten ändras. Varje ID som skapas mäts från samma fasta datum.

Snowflake-ID:ts struktur

Ett Snowflake-ID är ett 64-bitars heltal som är uppdelat i fyra delar, lästa från den mest signifikanta biten och nedåt:

BitarFältVärdemängd
1Teckenbitalltid 0
41Tidsstämpelmillisekunder sedan Twitter-epoken
5Datacenters-ID0–31
5Maskin-ID (worker-ID)0–31
12Sekvensnummer0–4095

Den inledande biten är alltid 0, så ett Snowflake-ID är alltid ett positivt tal. Tidsstämpeln på 41 bitar och sekvensfältet på 12 bitar är de två delar som gör Snowflake-ID:n användbara för sortering: ID:n som skapats senare har ett större tidsstämpelsegment och sorteras därför efter tidigare ID:n.

Snowflake-ID:ts formel

Generatorn skapar ID:t med denna formel:

d=t−1288834974657d = t - 1288834974657

I=(d<<22)∣(c<<17)∣(m<<12)∣sI = (d << 22) \mathbin{|} (c << 17) \mathbin{|} (m << 12) \mathbin{|} s

där d är delta, t den angivna tidsstämpeln i millisekunder, I det färdiga ID:t, c datacenters-ID:t, m maskin-ID:t och s sekvensnumret.

<< är en vänsterskiftning av bitar. Att skifta ett tal åt vänster med 22 bitar är samma sak som att multiplicera det med 2²², eller 4 194 304. Skiftmängderna (22, 17, 12) följer direkt av fältbredderna: sekvensfältet är 12 bitar brett, så maskin-ID:t ligger 12 bitar upp; maskinfältet är 5 bitar brett, så datacenters-ID:t ligger 17 bitar upp (12 + 5), och så vidare.

Så beräknas ett Snowflake-ID: räkneexempel

Anta att någon anger:

  • Tidsstämpel: 1 288 834 975 657 (exakt 1 000 ms efter Twitter-epoken)
  • Datacenters-ID: 1
  • Maskin-ID: 1
  • Sekvensnummer: 0

Steg 1 – hitta delta. Subtrahera epoken från tidsstämpeln: 1 288 834 975 657 − 1 288 834 974 657 = 1 000.

Steg 2 – skifta varje fält till rätt plats.

  • Tidsstämpel: 1 000 << 22 = 4 194 304 000
  • Datacenters-ID: 1 << 17 = 131 072
  • Maskin-ID: 1 << 12 = 4 096
  • Sekvens: 0

Steg 3 – kombinera med bitvis ELLER. Eftersom inget av de skiftade fälten överlappar varandra ger addition samma resultat som en ELLER-operation:

4 194 304 000 + 131 072 + 4 096 + 0 = 4 194 439 168

Det är Snowflake-ID:t för denna indata. Verktygets resultatvy delar upp samma 64-bitars binära sträng igen i ett 41-bitars tidsstämpelblock, ett 5-bitars datacenterblock, ett 5-bitars maskinblock och ett 12-bitars sekvensblock, så talets struktur förblir synlig.

Var Snowflake-ID:n används

Twitter skapade formatet för att ge unika, ungefär tidsordnade ID:n till tweets över tusentals databasmaskiner utan en central räknare som varje server skulle behöva kontrollera. Discord och Instagram började senare använda liknande 64-bitars ID-konstruktioner för meddelanden och inlägg. Samma idé förekommer i databasshardning, order-ID:n för e-handelssystem och händelseloggar i distribuerade applikationer. Den passar i alla miljöer där många maskiner tilldelar ID:n oberoende av varandra och ändå behöver kunna sortera dem ungefär efter tid.

Begränsningar hos Snowflake-ID:n

En Snowflake-generator i produktion har normalt en egen löpande klocka: den ökar sekvensnumret för varje ID som skapas under samma millisekund och väntar till nästa millisekund när sekvensen når 4 095. Det här verktyget sparar ingen information mellan beräkningarna. Det skapar ett ID från de värden som anges, vilket gör det användbart för att utforska formatet men annorlunda än en aktiv produktionstjänst.

Konstruktionen har fasta begränsningar, oavsett vilken tjänst som implementerar den:

  • Fast epok: den här generatorn accepterar bara tidsstämplar på eller efter 4 november 2010 (Twitter-epoken). Tidigare datum kan inte kodas.
  • Tidsstämpelns övre gräns: tidsstämpelfältet på 41 bitar tar slut omkring juli 2080. Därefter ryms inte längre delta från epoken i 41 bitar.
  • Sekvensgräns: endast 4 096 olika ID:n (0–4095) kan utfärdas av en maskin under samma millisekund innan värdena skulle upprepas.
  • Maskinutrymme: med 5 bitar vardera för maskin-ID och datacenters-ID har en installation 1 024 olika maskinidentiteter (32 × 32) att tilldela utan kollisioner.
  • Lokal, inte global, ordning: ID:n sorteras korrekt i förhållande till varandra endast om de kommer från maskiner med synkroniserade klockor. Klockdrift mellan maskiner kan bryta den strikta tidsordningen.

Snowflake-ID:ts historia

Twitter presenterade Snowflake-ID-formatet 2010 som ersättning för enkla autoinkrementerande databas-ID:n, som inte skalar över många oberoende databasservrar. Namnet kommer från idén att inga två genererade ID:n är likadana, precis som riktiga snöflingor. Konstruktionen gjordes senare till öppen källkod och kopierades i modifierad form av andra stora plattformar som behövde samma sak: unika, sorterbara ID:n som genereras av många maskiner samtidigt.

Vanliga frågor och svar

Vad är ett Snowflake-ID? Ett Snowflake-ID är ett 64-bitars tal som består av en tidsstämpel, en maskinidentifierare och ett sekvensnummer. Det är utformat så att många maskiner kan generera unika ID:n utan att samordna sig med varandra.

Vilken formel används för Snowflake-ID:n? id = ((timestamp − epoch) << 22) | (dataCenterId << 17) | (machineId << 12) | sequence, där epoken är ett fast startdatum och << är en vänsterskiftning av bitar.

Kan jag ändra epoken i den här generatorn? Nej. Verktyget mäter alltid tidsstämpeln från den fasta Twitter-epoken, 4 november 2010. Det finns inget fält för att ange ett annat startdatum.

Avkodar det här verktyget ett befintligt Snowflake-ID? Nej. Det skapar endast ett nytt ID från den angivna tidsstämpeln, det angivna maskin-ID:t, datacenters-ID:t och sekvensnumret och visar sedan bituppdelningen för det nya ID:t.

Hur många Snowflake-ID:n kan en maskin generera per millisekund? Upp till 4 096, eftersom sekvensfältet är 12 bitar brett (värden från 0 till 4 095).

Fram till vilket år kan den här generatorn producera giltiga tidsstämplar? Till omkring juli 2080. Tidsstämpelfältet på 41 bitar kan rymma högst ungefär 69,7 år räknat från den fasta 2010-epoken. Därefter överskrider värdet fältets kapacitet.

Referenser

  1. ”Announcing Snowflake.” Twitter Engineering Blog, 2010.
  2. "Snowflake ID." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID