Discord・X(旧Twitter)の Snowflake ID から作成日時・ワーカーID・シーケンスを復元。日時からの逆引きとカスタムエポックにも対応
上の「サービス(エポック)」と「シフト幅」の設定をそのまま使います。指定した時刻の1ミリ秒に発行されうるIDの最小値と最大値が出ます。「この日時より後に作られたIDだけを抽出する」といった検索条件を書くときに使えます。
Snowflake ID は64ビットの整数です。よく使われるレイアウトでは、上位42ビットが「エポックからの経過ミリ秒」、続く5ビットがワーカーID、次の5ビットがプロセスID、下位12ビットが同一ミリ秒内の連番(シーケンス)になります。つまり id >> 22 で経過ミリ秒が取り出せ、そこにエポックを足すと Unix ミリ秒になります。同じミリ秒に最大4096個まで採番できる計算です。
エポックは「そのサービスが0ミリ秒とする時刻」です。Discord は 2015-01-01 00:00:00 UTC(Unixミリ秒で 1420070400000)、X(旧Twitter)は 1288834974657 を使います。エポックを取り違えると、復元される日時が数年単位でずれます。うまくいかないときは、まずここを疑ってください。
ワーカーID・プロセスID・シーケンスの内訳は、シフト幅が22ビットのときだけ表示します。シフト幅を変えると下位ビットの割り当てもサービスごとに変わるため、推測で分解しません。22以外を指定した場合は、下位ビットの値をまとめて表示します。
64ビットの整数で作られた一意な識別子です。上位ビットに「そのサービスが定めた基準時刻からの経過ミリ秒」が入っているため、IDそのものから作成日時を復元できます。Discord・X(旧Twitter)などが採用しています。
そのサービスが「0ミリ秒」とする基準時刻です。Discordは2015-01-01 00:00:00 UTC(1420070400000)、X(旧Twitter)は1288834974657を使います。エポックを間違えると復元される日時がまるごとずれます。
送られません。計算はすべてブラウザ内のJavaScript(BigInt)で行われ、IDがサーバーへ送信されることはありません。