Генеруйте та аналізуйте Twitter Snowflake ID, унікальні 64-бітні ідентифікатори, що використовуються в розподілених системах. Цей інструмент дозволяє вам створювати нові Snowflake ID та аналізувати існуючі, надаючи інсайти про їхній часовий штамп, ID машини та компоненти номеру послідовності.
Генератор ID Snowflake створює унікальні ідентифікатори для розподілених систем, спочатку розроблений Twitter для обробки даних в масштабах. Цей потужний генератор унікальних ID виробляє 64-бітні цілі числа, що складаються з мітки часу, ID машини та номера послідовності, забезпечуючи унікальність у розподілених системах без координації між серверами.
Наш безкоштовний онлайн-інструмент генератора ID Snowflake дозволяє вам генерувати та розбирати ID Snowflake миттєво, що робить його ідеальним для розробників, які працюють з мікросервісами, розподіленими базами даних та додатками з високою пропускною здатністю.
ID Snowflake — це 64-бітні цілі числа з ретельно спроектованою структурою, яка гарантує унікальність:
Ця структура розподіленого ID дозволяє генерувати приблизно 4,096 унікальних ID за мілісекунду на машину, що робить її ідеальною для розподілених систем з високою пропускною здатністю.
Слідуйте цим простим крокам, щоб згенерувати унікальні ID Snowflake:
Щоб декодувати ID Snowflake, введіть його в поле "Розібрати ID" та натисніть "Розібрати", щоб побачити його мітку часу, ID машини та компоненти послідовності.
Алгоритм ID Snowflake конструює унікальні ідентифікатори, використовуючи побітові операції:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
Компоненти формули:
timestamp
: Кількість мілісекунд з моменту початку епохиdatacenterId
: 5-бітне ціле число (0-31), що ідентифікує дата-центрworkerId
: 5-бітне ціле число (0-31), що ідентифікує робочу машинуsequence
: 12-бітне ціле число (0-4095) для кількох ID за мілісекундуАлгоритм генерації ID Snowflake слідує цим точним крокам:
Цей процес гарантує монотонно зростаючі ID в межах кожної машини, зберігаючи глобальну унікальність у розподілених системах.
ID Snowflake відмінно підходять для різних сценаріїв розподілених обчислень:
Хоча ID Snowflake є потужними, інші системи генерації унікальних ID включають:
Розуміння обмежень ID Snowflake допомагає в правильній реалізації:
ID Snowflake були представлені Twitter у 2010 році для вирішення проблеми генерації розподілених, сортованих за часом унікальних ідентифікаторів у масштабах. Коли база користувачів Twitter та обсяг твітів зросли, традиційні автоінкрементні ID стали недостатніми для їхньої розподіленої архітектури.
Система з тих пір була прийнята великими технологічними компаніями, включаючи Instagram, Discord та безліч інших платформ, які потребують масштабованої генерації ID для розподілених систем.
Реалізуйте генерацію ID Snowflake у вашій улюбленій мові програмування:
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('Годинник рухається назад. Відмовляюся генерувати id');
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// Використання
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`Згенерований ID Snowflake: ${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("Годинник рухається назад. Відмовляюся генерувати id")
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## Використання
58generator = SnowflakeGenerator(datacenter_id=1, worker_id=1)
59snowflake_id = generator.next_id()
60print(f"Згенерований ID Snowflake: {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 не може бути більшим за maxDatacenterId або меншим за 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId не може бути більшим за maxWorkerId або меншим за 0");
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("Годинник рухається назад. Відмовляюся генерувати id");
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("Згенерований ID Snowflake: " + id);
91 }
92}
93
require 'time' class SnowflakeGenerator def initialize(datacenter_id, worker_id, sequence = 0) @datacenter_id = datacenter_id @worker_id = worker_id @sequence = sequence @last_timestamp = -1 @epoch = 1288834974657 @datacenter_id_bits = 5 @worker_id_bits = 5 @sequence_bits = 12 @max_datacenter_id = -1 ^ (-1 << @datacenter_id_bits) @max_worker_id = -1 ^ (-1 << @worker_id_bits) @worker_id_shift = @sequence_bits @datacenter_id_shift = @sequence_bits + @worker_id_bits @timestamp_left_shift = @sequence_bits + @worker_id_bits + @datacenter_id_bits @sequence_mask = -1 ^ (-1 << @sequence_bits) end def next_id timestamp = (Time.now.to_f * 1000).to_i raise 'Годинник рухається назад' if timestamp < @last_timestamp if timestamp == @last_timestamp @sequence = (@sequence + 1) & @sequence_mask timestamp = til_next_millis(@last_timestamp) if @sequence == 0 else @sequence = 0 end @last_timestamp = timestamp ((timestamp - @epoch) <<
Відкрийте більше інструментів, які можуть бути корисними для вашого робочого процесу