开发者工具 · 时间 / 数字开发

雪花 ID

Twitter/Sonyflake 风格/解析

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 52 次使用
就绪
第一节

关于本工具

About

排查线上异常时,日志里吐出一个 7830453162089473,得先认出它是不是雪花 ID,再拆出时间戳、机器位、序列号——没有现成解析工具,全靠手算或翻代码。这个工具直接粘贴 ID 或批量输入,自动识别是 Twitter 标准雪花还是 Sonyflake 变体,逐段拆出毫秒时间、节点编号、同一毫秒内的自增序号。解析全程在浏览器本地完成,ID 不会离开设备。

使用场景

分布式 ID 冲突排查

上线第二天,运维发现凌晨 2 点日志里有两条订单 ID 完全一致,导致对账系统报错。开发组长怀疑是雪花算法 workerId 分配冲突或时钟回拨。把这两条 ID 贴进本工具,逐段解析出时间戳、机器 ID、序列号,发现时间戳差了 3 毫秒但序列号没递增——定位到是某台机器 NTP 同步时发生了 1 毫秒的回拨,在 Go 1.19 的 sonyflake 包里触发了序列号重置 bug。

跨团队 ID 格式对齐

A 组用标准雪花算法生成 64 位长整型,B 组用 sonyflake 生成 63 位,两套系统对接时 ID 始终对不上。架构师要求双方统一成 64 位,但 B 组坚持不改。把两个 ID 分别输入本工具,对比解析出的时间戳和机器位长度,发现 sonyflake 少了 1 位机器 ID 导致支持的工作节点数只有 256。会议当场用解析结果说服 B 组升级到 64 位方案,避免了下个月双十一的联调事故。

数据库分表路由验证

DBA 把用户表按 ID 后 4 位分 16 张子表,上线后某个大 V 的查询总是超时。怀疑是分表路由算法把该用户 ID 写进了错误的分表。把 ID 输入本工具解析出时间戳和序列号,发现该 ID 生成于 2023-06-15 14:23:17.891,序列号是 1023。DBA 用时间戳反推该时刻的并发量,确认当时单台 worker 的序列号已接近 4096 上限,导致 ID 尾部分布不均匀,部分分表数据量是其他表的 3 倍。

第三方 SDK 接入调试

接入某云厂商的推送 SDK,对方返回的 eventId 是 19 位数字,文档只写「雪花算法生成」。测试环境跑通后,预发布环境突然返回 ID 解析失败。把两个环境的 ID 分别贴进本工具,发现预发布的 ID 时间戳段解析出 2028 年——对方测试环境服务器时钟快了 5 年。截图发给对方运维,对方承认是测试服务器 NTP 配置错误,修复后问题解决。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「时间戳」输入框粘贴毫秒级 Unix 时间戳(如 1700000000000),下方自动显示对应的十进制/十六进制 ID 及解析结果
  2. 2在「机器 ID」字段填入 0-1023 的整数,右侧实时更新该机器在当前时间戳下生成的雪花 ID 示例
  3. 3点击「序列号」输入框旁的随机按钮,自动填充 0-4095 随机值,ID 预览区同步刷新
  4. 4勾选「Sonyflake 模式」开关,输入框切换为 10 毫秒时间戳粒度,解析结果自动适配 Sonyflake 位段结构
  5. 5点击任一 ID 结果行末尾的复制图标,将该 ID 值写入剪贴板,页面顶部出现「已复制」提示条

输入输出示例

输入输出说明
6560995634594127872时间戳:2025-03-21 10:30:45.123 UTC;工作节点ID:1;序列号:0常规:Twitter Snowflake 标准 64 位 ID,验证基本解析功能
0时间戳:1970-01-01 00:00:00.000 UTC;工作节点ID:0;序列号:0边界:全零 ID,测试工具对最小值的处理,避免溢出或错误
9223372036854775807时间戳:2038-01-19 03:14:07.999 UTC;工作节点ID:1023;序列号:4095边界:64 位有符号整数最大值,验证高位符号位是否被正确处理
6560995634594127873时间戳:2025-03-21 10:30:45.123 UTC;工作节点ID:1;序列号:1常规:序列号递增,验证同一毫秒内序列号解析正确
6560995634594127872时间戳:2025-03-21 10:30:45.123 UTC;工作节点ID:1;序列号:0易错:与第一条输入相同,测试工具是否缓存结果或每次解析一致
6560995634594127872时间戳:2025-03-21 10:30:45.123 UTC;工作节点ID:1;序列号:0常规:重复输入,验证幂等性
18446744073709551615时间戳:2106-02-07 06:28:15.999 UTC;工作节点ID:1023;序列号:4095边界:64 位无符号整数最大值,测试工具是否支持无符号解析
6560995634594127872时间戳:2025-03-21 10:30:45.123 UTC;工作节点ID:1;序列号:0易错:用户可能误传字符串带空格,测试工具是否自动 trim

常见错误对照

1.把机器ID填成十进制数,未理解位宽限制

✗ 错误machine_id: 1024
✓ 修复machine_id: 0 或 1(0~1023 有效)

雪花算法机器ID通常占10位(0~1023),填1024会溢出或解析异常。位宽由算法规范决定,非任意整数。

2.时间戳填了带毫秒的完整时间戳,未截断

✗ 错误timestamp: 1712345678901
✓ 修复timestamp: 1712345678(秒级)或自定义纪元偏移后的差值

雪花ID时间戳常以毫秒为单位且从自定义纪元开始计算,直接填Unix毫秒时间戳会导致ID超出预期范围或解析错误。

3.序列号从1开始,忽略了初始值约定

✗ 错误sequence: 1
✓ 修复sequence: 0(首次生成)

雪花算法序列号通常从0开始递增,填1会跳过0号ID,导致生成的ID序列不连续,影响单调性判断。

4.混淆了Twitter雪花与Sonyflake的位分配

✗ 错误在Sonyflake工具里填41位时间戳+10位机器ID
✓ 修复Sonyflake:39位时间戳+8位序列号+16位机器ID

Twitter雪花(41+10+12)与Sonyflake(39+8+16)位宽分配不同,混用会导致解析出的ID结构完全错误。

5.自定义纪元时间戳用了负数

✗ 错误epoch: -1609459200000
✓ 修复epoch: 1609459200000(2021-01-01 00:00:00 UTC)

雪花算法要求纪元为过去某固定时间点(正数毫秒),负数时间戳会导致生成ID的时间段为负,解析时无法对应实际时间。

6.把解析出的ID当成数据库主键直接排序

✗ 错误按ID升序排列,认为时间早的ID一定小
✓ 修复按时间戳字段单独排序,或确认ID单调递增后再排序

雪花ID整体递增依赖同一机器+同一序列号区间,跨机器或序列号回绕时,ID大小与时间顺序可能不一致。

7.在浏览器端用JS解析大ID时丢失精度

✗ 错误const id = 1712345678901123456; console.log(id);
✓ 修复使用BigInt:const id = 1712345678901123456n;

雪花ID为64位整数,超过JS Number安全整数范围(2^53-1),直接解析会截断尾部,导致机器ID或序列号错误。

第三节

工作原理

How It Works

核心公式

ID = (timestamp - epoch) << 22 | worker_id << 12 | sequence

变量说明

  • timestamp当前毫秒时间戳(如 1700000000000)
  • epoch自定义起始时间戳(默认 1288834974657)
  • worker_id机器 ID,范围 0–1023
  • sequence同一毫秒内序列号,范围 0–4095

示例

设 epoch=1288834974657,当前时间戳=1700000000000,worker_id=1,sequence=0:ID = (1700000000000 - 1288834974657) << 22 | 1 << 12 | 0 = 411165025343 << 22 | 4096 = 1724574727864320 + 4096 = 1724574731868416。最终 64 位整数 ID 为 1724574731868416。

输入时间戳拆分元素时间戳·序列号·机器ID解析展示各字段含义·时间Twitter / Sonyflake 风格纯浏览器本地计算
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
这个工具生成的雪花 ID 是 Twitter 那种还是 Sonyflake 那种?

两种都支持。工具页面提供选项切换「Twitter 风格」和「Sonyflake 风格」。Twitter 风格(Snowflake)使用 41 位时间戳 + 10 位机器 ID + 12 位序列号,适合高并发分布式场景;Sonyflake 使用 39 位时间戳 + 8 位机器 ID + 16 位序列号,序列空间更大但时间跨度更短(约 174 年 vs 69 年)。选择时主要看你的部署规模和期望的时间可用年限。

我拿到一个 19 位的数字,怎么知道它是雪花 ID 还是普通时间戳?

雪花 ID 是 64 位整数,通常表现为 18-19 位十进制数,但它的前几位是时间戳的偏移量编码,不是直接的时间数字。你可以把数字粘贴到本工具的「解析」输入框,工具会自动按 Snowflake/Sonyflake 两种格式尝试解码,并显示提取出的时间戳、机器 ID 和序列号。如果解码出的时间戳落在 2010 年之后且序列号规律递增,基本可以确认是雪花 ID。普通 Unix 时间戳(10 位秒级或 13 位毫秒级)位数不同,解码结果不会出现机器 ID 字段。

为什么我用同一个算法算出来的 ID 和线上别人给的 ID 对不上?

大概率是机器 ID 或起始时间(epoch)不同。雪花 ID 的生成依赖三个参数:自定义 epoch(起始时间戳)、机器 ID(worker ID)和序列号。不同系统可能设置不同的 epoch(Twitter 默认 2010-11-04,Sonyflake 默认 2014-09-01),或者分配了不同的机器 ID,导致同一时刻生成的 ID 完全不同。本工具在解析时允许你手动输入 epoch 和机器 ID 来匹配目标系统的配置;生成时也提供这些参数的自定义,确保和你的生产环境一致。

这个工具解析出来的时间怎么比我实际时间晚了 8 小时?

雪花 ID 内部的时间戳是 UTC 毫秒数(从 epoch 开始的偏移量),工具默认显示的是 UTC 时间。如果你看到的时间比你的本地时间晚了 8 小时,说明你的时区是东八区(UTC+8),工具显示的是 UTC 零时区时间。页面结果区同时标注了「UTC 时间」和「本地时间」两行,直接看本地时间行即可,不需要手动换算。如果你需要批量验证数据库里的 ID,建议统一用 UTC 行对比,避免时区转换错误。

生成的 ID 会不会重复?序列号满了怎么办?

同一毫秒内序列号溢出时,生成策略有区别。Snowflake 风格中,当 12 位序列号(0-4095)在同一毫秒内用完,生成器会等待下一毫秒再生成,所以不会重复。Sonyflake 风格序列号 16 位(0-65535),空间更大,但时间戳粒度是 10 毫秒,等待策略类似。本工具生成时完全模拟这两种行为,如果勾选了「强制等待」,会模拟生产环境中的阻塞等待;不勾选则序列号溢出时报错,方便测试边界情况。实际部署时,只要机器 ID 不冲突,ID 全局唯一。

我在浏览器里用这个工具,ID 生成和解析是在本地完成吗?会不会把我的数据上传?

完全在浏览器本地完成,不上传任何数据。工具实现方式标注为 FE(前端),所有雪花 ID 的生成和解析逻辑都用 JavaScript 在浏览器端执行,不经过任何后端服务器。你可以断网测试:关闭网络后刷新页面,工具依然可以正常生成和解析 ID。输入框里的数字、自定义参数(epoch、机器 ID)都不会离开你的浏览器。如果你需要处理敏感数据(如生产环境的真实 ID),可以放心使用。

为什么我输入一个数字,解析结果说「不是有效的雪花 ID」?

可能原因有三个:1)数字位数不对——雪花 ID 是 64 位整数,十进制表示通常 18-19 位,少于 15 位或超过 20 位的数字大概率不是雪花 ID;2)数字超出了雪花 ID 的时间范围——如果解析出的时间戳早于 epoch(默认 2010 年)或晚于未来 100 年,工具会标记无效;3)你选了错误的风格——比如输入的是 Sonyflake 格式的 ID 却选了 Twitter 解析模式,两者时间戳位数和机器 ID 位数不同。建议先切换风格试试,或者检查原 ID 的生成系统文档确认风格类型。

这个工具能批量解析一堆雪花 ID 吗?我有一千多个要查时间。

当前版本不支持批量上传文件或粘贴多行批量解析,每次只能解析一个 ID。如果你需要批量处理,可以借助浏览器开发者工具(F12)的 Console 功能:本工具的核心解析函数暴露在全局 window 对象上,你可以在 Console 里写循环调用。或者将 ID 列表导出为 CSV,用其他脚本工具(如 Python 的 snowflake-id 库)批量处理。工具定位是单次快速验证和调试,大批量场景建议用编程方式处理。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭