Snowflake-ID-Generator für verteilte Systeme und Analyse
Generieren und analysieren Sie Twitter Snowflake-IDs, einzigartige 64-Bit-Identifikatoren, die in verteilten Systemen verwendet werden. Dieses Tool ermöglicht es Ihnen, neue Snowflake-IDs zu erstellen und vorhandene zu analysieren, wobei Einblicke in ihre Zeitstempel-, Maschinen-ID- und Sequenznummern-Komponenten bereitgestellt werden.
Snowflake-ID-Generator
Snowflake-ID-Generator
Dokumentation
Snowflake ID Generator
Einführung
Eine Snowflake-ID ist ein eindeutiger Identifikator, der in verteilten Systemen verwendet wird und ursprünglich von Twitter entwickelt wurde. Dieses Tool ermöglicht es Ihnen, Snowflake-IDs zu generieren und zu analysieren, die aus 64-Bit-Ganzzahlen bestehen, die aus einem Zeitstempel, einer Maschinen-ID und einer Sequenznummer zusammengesetzt sind.
Wie Snowflake-IDs funktionieren
Snowflake-IDs sind 64-Bit-Ganzzahlen, die wie folgt strukturiert sind:
- 41 Bits: Zeitstempel (Millisekunden seit einer benutzerdefinierten Epoche)
- 10 Bits: Maschinen-ID (5 Bits für die Rechenzentrums-ID, 5 Bits für die Worker-ID)
- 12 Bits: Sequenznummer
Diese Struktur ermöglicht die Generierung von ungefähr 4.096 eindeutigen IDs pro Millisekunde pro Maschine.
Verwendung des Snowflake-ID-Generators
- (Optional) Setzen Sie eine benutzerdefinierte Epoche (Standard ist Twitters Epoche: 2010-11-04T01:42:54.657Z)
- Geben Sie eine Maschinen-ID (0-31) und eine Rechenzentrums-ID (0-31) ein
- Klicken Sie auf "Generieren", um eine neue Snowflake-ID zu erstellen
- Die generierte ID und ihre Komponenten werden angezeigt
Um eine vorhandene Snowflake-ID zu analysieren, geben Sie sie in das Feld "ID analysieren" ein und klicken Sie auf "Analysieren".
Formel
Die Snowflake-ID wird unter Verwendung von Bitoperationen konstruiert:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Wo:
timestamp
die Anzahl der Millisekunden seit der Epoche istdatacenterId
eine 5-Bit-Ganzzahl (0-31) istworkerId
eine 5-Bit-Ganzzahl (0-31) istsequence
eine 12-Bit-Ganzzahl (0-4095) ist
Berechnung
Der Snowflake-ID-Generator führt die folgenden Schritte aus:
- Holen Sie sich den aktuellen Zeitstempel in Millisekunden
- Stellen Sie sicher, dass der Zeitstempel größer ist als der zuletzt verwendete Zeitstempel (für Eindeutigkeit)
- Wenn der Zeitstempel derselbe ist wie der letzte, erhöhen Sie die Sequenznummer
- Wenn die Sequenznummer überläuft (4096 erreicht), warten Sie auf die nächste Millisekunde
- Kombinieren Sie die Komponenten mithilfe von Bitoperationen, um die endgültige ID zu erstellen
Anwendungsfälle
Snowflake-IDs sind besonders nützlich in:
- Verteilten Systemen: Generieren Sie eindeutige IDs über mehrere Maschinen hinweg ohne Koordination
- Hochvolumigen Daten: Erstellen Sie sortierbare IDs für große Datensätze
- Mikrodiensten: Stellen Sie sicher, dass eindeutige Identifikatoren über verschiedene Dienste hinweg vorhanden sind
- Datenbank-Sharding: Verwenden Sie die Zeitstempel- oder Maschinen-ID-Komponente für effizientes Sharding
Alternativen
Obwohl Snowflake-IDs leistungsstark sind, gibt es andere ID-Generierungssysteme, darunter:
- UUID (Universally Unique Identifier): Nützlich, wenn eine verteilte Generierung ohne Sortierbarkeit erforderlich ist
- Auto-incrementing-Datenbank-IDs: Einfach, aber auf einzelne Datenbankinstanzen beschränkt
- ULID (Universally Unique Lexicographically Sortable Identifier): Ähnlich wie Snowflake, jedoch mit einer anderen Struktur
Randfälle und Einschränkungen
-
Uhrensynchronisation: Snowflake-IDs sind auf die Systemzeit angewiesen. Wenn die Uhr aufgrund von NTP-Anpassungen oder Änderungen der Sommerzeit zurückgesetzt wird, kann dies Probleme bei der ID-Generierung verursachen.
-
Jahr-2038-Problem: Der 41-Bit-Zeitstempel wird 2079 überlaufen (vorausgesetzt, die Twitter-Epoche). Systeme, die Snowflake-IDs verwenden, sollten für diese Eventualität planen.
-
Maschinen-ID-Kollisionen: In großen verteilten Systemen kann es eine Herausforderung sein, eindeutige Maschinen-IDs sicherzustellen, was möglicherweise zusätzliche Koordination erfordert.
-
Sequenzüberlauf: In extrem hochdurchsatzfähigen Szenarien ist es möglich, die 4096 Sequenzen pro Millisekunde zu erschöpfen, was möglicherweise zu Verzögerungen führt.
-
Nichtmonotonie über Maschinen hinweg: Während IDs auf einer einzelnen Maschine monoton ansteigend sind, sind sie möglicherweise nicht strikt monoton über mehrere Maschinen hinweg.
Geschichte
Snowflake-IDs wurden 2010 von Twitter eingeführt, um den Bedarf an verteilten, zeitlich sortierbaren eindeutigen Identifikatoren zu decken. Sie wurden seitdem von vielen anderen Unternehmen und Projekten übernommen und angepasst.
Beispiele
Hier sind Implementierungen von Snowflake-ID-Generatoren in verschiedenen Sprachen:
1class SnowflakeGenerator {
2 constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
3 this.epoch = BigInt(epoch);
4 this.datacenterIdBits = datacenterIdBits;
5 this.workerIdBits = workerIdBits;
6 this.sequenceBits = sequenceBits;
7 this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
8 this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
9 this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
10 this.workerIdShift = BigInt(sequenceBits);
11 this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
12 this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
13 this.sequence = 0n;
14 this.lastTimestamp = -1n;
15 }
16
17 nextId(datacenterId, workerId) {
18 let timestamp = this.currentTimestamp();
19
20 if (timestamp < this.lastTimestamp) {
21 throw new Error('Die Uhr ist zurückgegangen. ID-Generierung verweigert');
22 }
23
24 if (timestamp === this.lastTimestamp) {
25 this.sequence = (this.sequence + 1n) & this.sequenceMask;
26 if (this.sequence === 0n) {
27 timestamp = this.tilNextMillis(this.lastTimestamp);
28 }
29 } else {
30 this.sequence = 0n;
31 }
32
33 this.lastTimestamp = timestamp;
34
35 return ((timestamp - this.epoch) << this.timestampLeftShift) |
36 (BigInt(datacenterId) << this.datacenterIdShift) |
37 (BigInt(workerId) << this.workerIdShift) |
38 this.sequence;
39 }
40
41 tilNextMillis(lastTimestamp) {
42 let timestamp = this.currentTimestamp();
43 while (timestamp <= lastTimestamp) {
44 timestamp = this.currentTimestamp();
45 }
46 return timestamp;
47 }
48
49 currentTimestamp() {
50 return BigInt(Date.now());
51 }
52}
53
54// Verwendung
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Generierte Snowflake-ID: ${id}`);
58
1import time
2import threading
3
4class SnowflakeGenerator:
5 def __init__(self, datacenter_id, worker_id, sequence=0):
6 self.datacenter_id = datacenter_id
7 self.worker_id = worker_id
8 self.sequence = sequence
9
10 self.last_timestamp = -1
11 self.epoch = 1288834974657
12
13 self.datacenter_id_bits = 5
14 self.worker_id_bits = 5
15 self.sequence_bits = 12
16
17 self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
18 self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
19
20 self.worker_id_shift = self.sequence_bits
21 self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
22 self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
23 self.sequence_mask = -1 ^ (-1 << self.sequence_bits)
24
25 self._lock = threading.Lock()
26
27 def _til_next_millis(self, last_timestamp):
28 timestamp = self._get_timestamp()
29 while timestamp <= last_timestamp:
30 timestamp = self._get_timestamp()
31 return timestamp
32
33 def _get_timestamp(self):
34 return int(time.time() * 1000)
35
36 def next_id(self):
37 with self._lock:
38 timestamp = self._get_timestamp()
39
40 if timestamp < self.last_timestamp:
41 raise ValueError("Die Uhr ist zurückgegangen. ID-Generierung verweigert")
42
43 if timestamp == self.last_timestamp:
44 self.sequence = (self.sequence + 1) & self.sequence_mask
45 if self.sequence == 0:
46 timestamp = self._til_next_millis(self.last_timestamp)
47 else:
48 self.sequence = 0
49
50 self.last_timestamp = timestamp
51
52 return ((timestamp - self.epoch) << self.timestamp_left_shift) | \
53 (self.datacenter_id << self.datacenter_id_shift) | \
54 (self.worker_id << self.worker_id_shift) | \
55 self.sequence
56
57## Verwendung
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Generierte Snowflake-ID: {snowflake_id}")
61
1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class SnowflakeGenerator {
5 private final long epoch;
6 private final long datacenterIdBits;
7 private final long workerIdBits;
8 private final long sequenceBits;
9 private final long maxDatacenterId;
10 private final long maxWorkerId;
11 private final long workerIdShift;
12 private final long datacenterIdShift;
13 private final long timestampLeftShift;
14 private final long sequenceMask;
15
16 private long datacenterId;
17 private long workerId;
18 private long sequence = 0L;
19 private long lastTimestamp = -1L;
20
21 private final Lock lock = new ReentrantLock();
22
23 public SnowflakeGenerator(long datacenterId, long workerId) {
24 this.epoch = 1288834974657L;
25 this.datacenterIdBits = 5L;
26 this.workerIdBits = 5L;
27 this.sequenceBits = 12L;
28
29 this.maxDatacenterId = ~(-1L << datacenterIdBits);
30 this.maxWorkerId = ~(-1L << workerIdBits);
31
32 this.workerIdShift = sequenceBits;
33 this.datacenterIdShift = sequenceBits + workerIdBits;
34 this.timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
35 this.sequenceMask = ~(-1L << sequenceBits);
36
37 if (datacenterId > maxDatacenterId || datacenterId < 0) {
38 throw new IllegalArgumentException("datacenterId kann nicht größer als maxDatacenterId oder kleiner als 0 sein");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId kann nicht größer als maxWorkerId oder kleiner als 0 sein");
42 }
43 this.datacenterId = datacenterId;
44 this.workerId = workerId;
45 }
46
47 public long nextId() {
48 lock.lock();
49 try {
50 long timestamp = timeGen();
51 if (timestamp < lastTimestamp) {
52 throw new RuntimeException("Die Uhr ist zurückgegangen. ID-Generierung verweigert");
53 }
54
55 if (lastTimestamp == timestamp) {
56 sequence = (sequence + 1) & sequenceMask;
57 if (sequence == 0) {
58 timestamp = tilNextMillis(lastTimestamp);
59 }
60 } else {
61 sequence = 0L;
62 }
63
64 lastTimestamp = timestamp;
65
66 return ((timestamp - epoch) << timestampLeftShift) |
67 (datacenterId << datacenterIdShift) |
68 (workerId << workerIdShift) |
69 sequence;
70 } finally {
71 lock.unlock();
72 }
73 }
74
75 private long tilNextMillis(long lastTimestamp) {
76 long timestamp = timeGen();
77 while (timestamp <= lastTimestamp) {
78 timestamp = timeGen();
79 }
80 return timestamp;
81 }
82
83 private long timeGen() {
84 return System.currentTimeMillis();
85 }
86
87 public static void main(String[] args) {
88 SnowflakeGenerator generator = new SnowflakeGenerator(1, 1);
89 long id = generator.nextId();
90 System.out.println("Generierte Snowflake-ID: " + id);
91 }
92}
93
1require 'time'
2
3class SnowflakeGenerator
4 def initialize(datacenter_id, worker_id, sequence = 0)
5 @datacenter_id = datacenter_id
6 @worker_id = worker_id
7 @sequence = sequence
8 @last_timestamp = -1
9 @epoch = 1288834974657
10 @datacenter_id_bits = 5
11 @worker_id_bits = 5
12 @sequence_bits = 12
13 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits)
14 @max_worker_id = -1 ^ (-1 << @worker_id_bits)
15 @worker_id_shift = @sequence_bits
16 @datacenter_id_shift = @sequence_bits + @worker_id_bits
17 @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits
18 @sequence_mask = -1 ^ (-1 << @sequence_bits)
19 end
20
21 def next_id
22 timestamp = (Time.now.to_f * 1000).to_i
23 raise 'Die Uhr ist zurückgegangen' if timestamp < @last_timestamp
24
25 if timestamp == @last_timestamp
26 @sequence = (@sequence + 1) & @sequence_mask
27 timestamp = til_next_millis(@last_timestamp) if @sequence == 0
28 else
29 @sequence = 0
30 end
31
32 @last_timestamp = timestamp
33
34 ((timestamp - @epoch) << @timestamp_left_shift) |
35 (@datacenter_id << @datacenter_id_shift) |
36 (@worker_id << @worker_id_shift) |
37 @sequence
38 end
39
40 private
41
42 def til_next_millis(last_timestamp)
43 timestamp = (Time.now.to_f * 1000).to_i
44 timestamp = (Time.now.to_f * 1000).to_i while timestamp <= last_timestamp
45 timestamp
46 end
47end
48
49## Verwendung
50generator = SnowflakeGenerator.new(1, 1)
51snowflake_id = generator.next_id
52puts "Generierte Snowflake-ID: #{snowflake_id}"
53
1<?php
2
3class SnowflakeGenerator {
4 private $epoch;
5 private $datacenterIdBits;
6 private $workerIdBits;
7 private $sequenceBits;
8 private $maxDatacenterId;
9 private $maxWorkerId;
10 private $workerIdShift;
11 private $datacenterIdShift;
12 private $timestampLeftShift;
13 private $sequenceMask;
14
15 private $datacenterId;
16 private $workerId;
17 private $sequence = 0;
18 private $lastTimestamp = -1;
19
20 public function __construct($datacenterId, $workerId) {
21 $this->epoch = 1288834974657;
22 $this->datacenterIdBits = 5;
23 $this->workerIdBits = 5;
24 $this->sequenceBits = 12;
25
26 $this->maxDatacenterId = -1 ^ (-1 << $this->datacenterIdBits);
27 $this->maxWorkerId = -1 ^ (-1 << $this->workerIdBits);
28
29 $this->workerIdShift = $this->sequenceBits;
30 $this->datacenterIdShift = $this->sequenceBits + $this->workerIdBits;
31 $this->timestampLeftShift = $this->sequenceBits + $this->workerIdBits + $this->datacenterIdBits;
32 $this->sequenceMask = -1 ^ (-1 << $this->sequenceBits);
33
34 if ($datacenterId > $this->maxDatacenterId || $datacenterId < 0) {
35 throw new Exception("datacenterId kann nicht größer als maxDatacenterId oder kleiner als 0 sein");
36 }
37 if ($workerId > $this->maxWorkerId || $workerId < 0) {
38 throw new Exception("workerId kann nicht größer als maxWorkerId oder kleiner als 0 sein");
39 }
40 $this->datacenterId = $datacenterId;
41 $this->workerId = $workerId;
42 }
43
44 public function nextId() {
45 $timestamp = $this->timeGen();
46
47 if ($timestamp < $this->lastTimestamp) {
48 throw new Exception("Die Uhr ist zurückgegangen. ID-Generierung verweigert");
49 }
50
51 if ($this->lastTimestamp == $timestamp) {
52 $this->sequence = ($this->sequence + 1) & $this->sequenceMask;
53 if ($this->sequence == 0) {
54 $timestamp = $this->tilNextMillis($this->lastTimestamp);
55 }
56 } else {
57 $this->sequence = 0;
58 }
59
60 $this->lastTimestamp = $timestamp;
61
62 return (($timestamp - $this->epoch) << $this->timestampLeftShift) |
63 ($this->datacenterId << $this->datacenterIdShift) |
64 ($this->workerId << $this->workerIdShift) |
65 $this->sequence;
66 }
67
68 private function tilNextMillis($lastTimestamp) {
69 $timestamp = $this->timeGen();
70 while ($timestamp <= $lastTimestamp) {
71 $timestamp = $this->timeGen();
72 }
73 return $timestamp;
74 }
75
76 private function timeGen() {
77 return floor(microtime(true) * 1000);
78 }
79}
80
81// Verwendung
82$generator = new SnowflakeGenerator(1, 1);
83$id = $generator->nextId();
84echo "Generierte Snowflake-ID: " . $id . "\n";
85
1using System;
2using System.Threading;
3
4public class SnowflakeGenerator
5{
6 private readonly long _epoch;
7 private readonly int _datacenterIdBits;
8 private readonly int _workerIdBits;
9 private readonly int _sequenceBits;
10 private readonly long _maxDatacenterId;
11 private readonly long _maxWorkerId;
12 private readonly int _workerIdShift;
13 private readonly int _datacenterIdShift;
14 private readonly int _timestampLeftShift;
15 private readonly long _sequenceMask;
16
17 private readonly long _datacenterId;
18 private readonly long _workerId;
19 private long _sequence = 0L;
20 private long _lastTimestamp = -1L;
21
22 private readonly object _lock = new object();
23
24 public SnowflakeGenerator(long datacenterId, long workerId)
25 {
26 _epoch = 1288834974657L;
27 _datacenterIdBits = 5;
28 _workerIdBits = 5;
29 _sequenceBits = 12;
30
31 _maxDatacenterId = -1L ^ (-1L << _datacenterIdBits);
32 _maxWorkerId = -1L ^ (-1L << _workerIdBits);
33
34 _workerIdShift = _sequenceBits;
35 _datacenterIdShift = _sequenceBits + _workerIdBits;
36 _timestampLeftShift = _sequenceBits + _workerIdBits + _datacenterIdBits;
37 _sequenceMask = -1L ^ (-1L << _sequenceBits);
38
39 if (datacenterId > _maxDatacenterId || datacenterId < 0)
40 {
41 throw new ArgumentException($"datacenterId kann nicht größer als {_maxDatacenterId} oder kleiner als 0 sein");
42 }
43 if (workerId > _maxWorkerId || workerId < 0)
44 {
45 throw new ArgumentException($"workerId kann nicht größer als {_maxWorkerId} oder kleiner als 0 sein");
46 }
47 _datacenterId = datacenterId;
48 _workerId = workerId;
49 }
50
51 public long NextId()
52 {
53 lock (_lock)
54 {
55 var timestamp = TimeGen();
56
57 if (timestamp < _lastTimestamp)
58 {
59 throw new Exception("Die Uhr ist zurückgegangen. ID-Generierung verweigert");
60 }
61
62 if (_lastTimestamp == timestamp)
63 {
64 _sequence = (_sequence + 1) & _sequenceMask;
65 if (_sequence == 0)
66 {
67 timestamp = TilNextMillis(_lastTimestamp);
68 }
69 }
70 else
71 {
72 _sequence = 0L;
73 }
74
75 _lastTimestamp = timestamp;
76
77 return ((timestamp - _epoch) << _timestampLeftShift) |
78 (_datacenterId << _datacenterIdShift) |
79 (_workerId << _workerIdShift) |
80 _sequence;
81 }
82 }
83
84 private long TilNextMillis(long lastTimestamp)
85 {
86 var timestamp = TimeGen();
87 while (timestamp <= lastTimestamp)
88 {
89 timestamp = TimeGen();
90 }
91 return timestamp;
92 }
93
94 private long TimeGen()
95 {
96 return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
97 }
98}
99
100// Verwendung
101class Program
102{
103 static void Main(string[] args)
104 {
105 var generator = new SnowflakeGenerator(1, 1);
106 var id = generator.NextId();
107 Console.WriteLine($"Generierte Snowflake-ID: {id}");
108 }
109}
110
1package main
2
3import (
4 "fmt"
5 "sync"
6 "time"
7)
8
9type SnowflakeGenerator struct {
10 epoch int64
11 datacenterIdBits uint
12 workerIdBits uint
13 sequenceBits uint
14 maxDatacenterId int64
15 maxWorkerId int64
16 workerIdShift uint
17 datacenterIdShift uint
18 timestampLeftShift uint
19 sequenceMask int64
20
21 datacenterId int64
22 workerId int64
23 sequence int64
24 lastTimestamp int64
25
26 lock sync.Mutex
27}
28
29func NewSnowflakeGenerator(datacenterId, workerId int64) (*SnowflakeGenerator, error) {
30 g := &SnowflakeGenerator{
31 epoch: 1288834974657,
32 datacenterIdBits: 5,
33 workerIdBits: 5,
34 sequenceBits: 12,
35 lastTimestamp: -1,
36 }
37
38 g.maxDatacenterId = -1 ^ (-1 << g.datacenterIdBits)
39 g.maxWorkerId = -1 ^ (-1 << g.workerIdBits)
40
41 g.workerIdShift = g.sequenceBits
42 g.datacenterIdShift = g.sequenceBits + g.workerIdBits
43 g.timestampLeftShift = g.sequenceBits + g.workerIdBits + g.datacenterIdBits
44 g.sequenceMask = -1 ^ (-1 << g.sequenceBits)
45
46 if datacenterId > g.maxDatacenterId || datacenterId < 0 {
47 return nil, fmt.Errorf("datacenterId kann nicht größer als %d oder kleiner als 0 sein", g.maxDatacenterId)
48 }
49 if workerId > g.maxWorkerId || workerId < 0 {
50 return nil, fmt.Errorf("workerId kann nicht größer als %d oder kleiner als 0 sein", g.maxWorkerId)
51 }
52 g.datacenterId = datacenterId
53 g.workerId = workerId
54
55 return g, nil
56}
57
58func (g *SnowflakeGenerator) NextId() (int64, error) {
59 g.lock.Lock()
60 defer g.lock.Unlock()
61
62 timestamp := g.timeGen()
63
64 if timestamp < g.lastTimestamp {
65 return 0, fmt.Errorf("Die Uhr ist zurückgegangen, ID-Generierung verweigert")
66 }
67
68 if g.lastTimestamp == timestamp {
69 g.sequence = (g.sequence + 1) & g.sequenceMask
70 if g.sequence == 0 {
71 timestamp = g.tilNextMillis(g.lastTimestamp)
72 }
73 } else {
74 g.sequence = 0
75 }
76
77 g.lastTimestamp = timestamp
78
79 return ((timestamp - g.epoch) << g.timestampLeftShift) |
80 (g.datacenterId << g.datacenterIdShift) |
81 (g.workerId << g.workerIdShift) |
82 g.sequence, nil
83}
84
85func (g *SnowflakeGenerator) tilNextMillis(lastTimestamp int64) int64 {
86 timestamp := g.timeGen()
87 for timestamp <= lastTimestamp {
88 timestamp = g.timeGen()
89 }
90 return timestamp
91}
92
93func (g *SnowflakeGenerator) timeGen() int64 {
94 return time.Now().UnixNano() / int64(time.Millisecond)
95}
96
97func main() {
98 generator, err := NewSnowflakeGenerator(1, 1)
99 if err != nil {
100 fmt.Printf("Fehler beim Erstellen des Generators: %v\n", err)
101 return
102 }
103
104 id, err := generator.NextId()
105 if err != nil {
106 fmt.Printf("Fehler bei der ID-Generierung: %v\n", err)
107 return
108 }
109
110 fmt.Printf("Generierte Snowflake-ID: %d\n", id)
111}
112
Diagramm
Hier ist eine visuelle Darstellung der Struktur der Snowflake-ID:
Referenzen
- "Ankündigung von Snowflake." Twitter Engineering Blog, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
- "Snowflake-ID." Wikipedia, https://de.wikipedia.org/wiki/Snowflake_ID
- "Verteilte ID-Generierung in Mikrodiensten." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f
Feedback
Klicken Sie auf das Feedback-Toast, um Feedback zu diesem Tool zu geben
Verwandte Werkzeuge
Entdecken Sie weitere Werkzeuge, die für Ihren Arbeitsablauf nützlich sein könnten