snowflake ID 的工作原理
snowflake 是一个 64 位整数:41 位时间戳(自平台特定纪元以来的毫秒数)、5 位工作节点、5 位进程、12 位序列号。这就是 ID 大致按时间排序的原因——也是时间戳可以被还原的原因:timestamp = (id >> 22) + epoch。
各平台的 epoch 起始时间
- Discord:纪元 1420070400000 = 2015-01-01 UTC。部分客户端显示中 Discord ID 带前导「c」——解码前先去掉它。
- Twitter / X:纪元 1288834974657 = 2010-11-04 01:42:54 UTC。推文和用户 ID 的解码方式相同。
- Instagram:纪元 1314220021721 ≈ 2011-08-24。媒体 ID 使用相同的 41 位方案。
- 自定义:一些内部系统使用自己的纪元——输入它(自 1970-01-01 起的毫秒数),解码器会应用相同的位移。
实际用途
- 账号年龄:解码 Discord 用户 ID 即可知道账号的创建时间——有助于识别刚注册的新账号。
- 消息取证:消息 ID 的时间戳比显示时间更精确,可用于精确排序。
- 批量日志分析:粘贴数千个 ID;表格会逐行显示每个 ID 对应的 UTC 时间。
- ID 是 64 位——超出了 JS 安全整数范围,因此解码器内部以 BigInt 处理,绝不丢失精度。