From 5fa68924e32932c9d117cca14f34f6d24a7d68c6 Mon Sep 17 00:00:00 2001 From: wsy182 <2392948297@qq.com> Date: Wed, 15 Oct 2025 11:15:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(websocket):=20=E6=9B=B4=E6=96=B0WebSocket?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=9C=B0=E5=9D=80=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E4=BB=A4=E7=89=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将连接地址从 wss://192.168.1.3/ws/ 更改为 ws://192.168.1.41:9516/ws/- 添加了用于身份验证的 Bearer Token - 启用 WebSocket 调试追踪功能 --- snowflake_generator.py | 66 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 snowflake_generator.py diff --git a/snowflake_generator.py b/snowflake_generator.py new file mode 100644 index 0000000..2861677 --- /dev/null +++ b/snowflake_generator.py @@ -0,0 +1,66 @@ +import time +import threading +EPOCH_JAVA_COMMON = 1288834974657 +class Snowflake: + def __init__(self, datacenter_id: int = 0, worker_id: int = 0, epoch: int = 1480166465631): + # 机器和数据中心配置 + self.worker_id_bits = 5 + self.datacenter_id_bits = 5 + self.sequence_bits = 12 + + self.max_worker_id = -1 ^ (-1 << self.worker_id_bits) + self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits) + + if worker_id > self.max_worker_id or worker_id < 0: + raise ValueError(f"worker_id 超出范围 (0 ~ {self.max_worker_id})") + if datacenter_id > self.max_datacenter_id or datacenter_id < 0: + raise ValueError(f"datacenter_id 超出范围 (0 ~ {self.max_datacenter_id})") + + self.worker_id = worker_id + self.datacenter_id = datacenter_id + self.epoch = epoch + + self.sequence = 0 + self.last_timestamp = -1 + + self.worker_id_shift = self.sequence_bits + self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits + self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits + self.sequence_mask = -1 ^ (-1 << self.sequence_bits) + + self.lock = threading.Lock() + + def _timestamp(self): + return int(time.time() * 1000) + + def _til_next_millis(self, last_timestamp): + timestamp = self._timestamp() + while timestamp <= last_timestamp: + timestamp = self._timestamp() + return timestamp + + def next_id(self) -> int: + with self.lock: + timestamp = self._timestamp() + if timestamp < self.last_timestamp: + raise Exception("时钟回拨,拒绝生成ID") + + if timestamp == self.last_timestamp: + self.sequence = (self.sequence + 1) & self.sequence_mask + if self.sequence == 0: + timestamp = self._til_next_millis(self.last_timestamp) + else: + self.sequence = 0 + + self.last_timestamp = timestamp + + return ((timestamp - self.epoch) << self.timestamp_left_shift) | \ + (self.datacenter_id << self.datacenter_id_shift) | \ + (self.worker_id << self.worker_id_shift) | \ + self.sequence + + +if __name__ == "__main__": + snowflake = Snowflake(datacenter_id=0, worker_id=0, epoch=EPOCH_JAVA_COMMON) + for _ in range(10): + print(str(snowflake.next_id()))