สร้างและวิเคราะห์ Twitter Snowflake IDs ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันขนาด 64 บิตที่ใช้ในระบบกระจาย เครื่องมือนี้ช่วยให้คุณสร้าง Snowflake IDs ใหม่และแยกวิเคราะห์ IDs ที่มีอยู่ โดยให้ข้อมูลเชิงลึกเกี่ยวกับส่วนประกอบของเวลา, ID เครื่อง, และหมายเลขลำดับ
Snowflake ID generator สร้างตัวระบุที่ไม่ซ้ำกันสำหรับระบบกระจาย ซึ่งพัฒนาโดย Twitter เพื่อจัดการการประมวลผลข้อมูลขนาดใหญ่ เครื่องมือ unique ID generator ที่ทรงพลังนี้ผลิตจำนวนเต็ม 64 บิตที่ประกอบด้วย timestamp, machine ID และ sequence number ซึ่งรับประกัน ความไม่ซ้ำกันในระบบกระจาย โดยไม่ต้องประสานงานระหว่างเซิร์ฟเวอร์
เครื่องมือ Snowflake ID generator ออนไลน์ฟรีของเราช่วยให้คุณสามารถ สร้างและแยกวิเคราะห์ Snowflake IDs ได้ทันที ทำให้เหมาะสำหรับนักพัฒนาที่ทำงานกับไมโครเซอร์วิส, ฐานข้อมูลกระจาย และแอปพลิเคชันที่มีการประมวลผลสูง
Snowflake IDs เป็นจำนวนเต็ม 64 บิตที่มีโครงสร้างที่ออกแบบมาอย่างรอบคอบเพื่อรับประกันความไม่ซ้ำกัน:
โครงสร้าง ID แบบกระจายนี้ ช่วยให้สามารถสร้าง 4,096 ID ที่ไม่ซ้ำกันต่อมิลลิวินาทีต่อเครื่อง ทำให้เหมาะสำหรับระบบกระจายที่มีการประมวลผลสูง
ทำตามขั้นตอนง่ายๆ เหล่านี้เพื่อ สร้าง Snowflake IDs ที่ไม่ซ้ำกัน:
เพื่อ ถอดรหัส Snowflake ID ให้ป้อนในช่อง "Parse ID" และคลิก "Parse" เพื่อดู timestamp, machine ID และส่วนประกอบ sequence
อัลกอริธึม Snowflake ID สร้างตัวระบุที่ไม่ซ้ำกันโดยใช้การดำเนินการแบบบิต:
1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2
ส่วนประกอบของสูตร:
timestamp
: จำนวนมิลลิวินาทีตั้งแต่ยุคที่กำหนดdatacenterId
: จำนวนเต็ม 5 บิต (0-31) ที่ระบุศูนย์ข้อมูลworkerId
: จำนวนเต็ม 5 บิต (0-31) ที่ระบุเครื่องคนงานsequence
: จำนวนเต็ม 12 บิต (0-4095) สำหรับ ID หลายตัวต่อมิลลิวินาทีอัลกอริธึมการสร้าง Snowflake ID ปฏิบัติตามขั้นตอนที่แม่นยำเหล่านี้:
กระบวนการนี้รับประกัน ID ที่เพิ่มขึ้นอย่างต่อเนื่อง ภายในแต่ละเครื่องในขณะที่รักษาความไม่ซ้ำกันทั่วทั้งระบบกระจาย
Snowflake IDs โดดเด่นในหลายสถานการณ์การคอมพิวเตอร์แบบกระจาย:
ในขณะที่ Snowflake IDs มีพลัง แต่ระบบ การสร้าง ID ที่ไม่ซ้ำกัน อื่นๆ ได้แก่:
การเข้าใจ ข้อจำกัดของ Snowflake ID ช่วยในการดำเนินการอย่างเหมาะสม:
Snowflake IDs ถูกนำเสนอโดย Twitter ในปี 2010 เพื่อแก้ปัญหาการสร้างตัวระบุที่ไม่ซ้ำกันที่สามารถเรียงลำดับตามเวลาได้ในระดับขนาดใหญ่ เมื่อฐานผู้ใช้และปริมาณทวีตของ Twitter เพิ่มขึ้นอย่างรวดเร็ว ID ที่เพิ่มขึ้นแบบดั้งเดิมไม่เพียงพอสำหรับสถาปัตยกรรมที่กระจายของพวกเขา
ระบบนี้ได้รับการนำไปใช้โดยบริษัทเทคโนโลยีชั้นนำรวมถึง Instagram, Discord และแพลตฟอร์มอื่นๆ ที่ต้องการ การสร้าง ID ที่สามารถขยายได้ สำหรับระบบกระจาย
ดำเนินการ การสร้าง Snowflake ID ในภาษาการเขียนโปรแกรมที่คุณชื่นชอบ:
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(`Generated 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("นาฬิกาเคลื่อนที่ถอยหลัง ปฏิเสธที่จะสร้าง 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"Generated 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 can't be greater than maxDatacenterId or less than 0");
39 }
40 if (workerId > maxWorkerId || workerId < 0) {
41 throw new IllegalArgumentException("workerId can't be greater than maxWorkerId or less than 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("Generated Snowflake ID: " + 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) << @timestamp_left_shift) | (@datacenter_id << @datacenter_id_shift) | (@worker_id << @worker_id_shift) | @sequence end private def til_next_millis(last_timestamp) timestamp = (Time.now.to_f * 1000).to_i timestamp = (Time.now.to_f * 1000).to_i while timestamp <= last_timestamp timestamp end end ## การใช้งาน generator = SnowflakeGenerator.new(
ค้นพบเครื่องมือเพิ่มเติมที่อาจมีประโยชน์สำหรับการทำงานของคุณ