TwitterのステータスIDの仕組み

世界最初のツイートは、ジャック・ドーシー(Jack Dorsey)による 2006-03-22 の https://twitter.com/jack/status/20 である。この「20」というツイートのIDは、当時はMySQLのユニークIDを使っていたようだが、2010-06-01 の Announcing Snowflake という記事で、Snowflake という仕組みに切り替えることがアナウンスされた。

現在の Twitter ID は、Snowflake という仕組みで、日時から生成される。下位22ビットはユニークなランダム値で,上位は 2010-11-04 01:42:54.657 UTC (2010-11-04 10:42:54.657 JST) を起点としたミリ秒単位の時刻を表す。したがって,IDからツイートのタイムスタンプを求めるには次のようにすればよい:

import datetime

def id2time(id):
    return ((id >> 22) + 1288834974657) / 1000

id = 1177189139873054725 # このIDのツイートのタイムスタンプを求める
print(f'{datetime.datetime.fromtimestamp(id2time(id)):%Y-%m-%d %H:%M:%S}')

2019-09-26 20:52:16 と出力される。あるいは次のようにしてもよい:

import numpy as np

print(np.datetime64("2010-11-04 10:42:54.657") + np.timedelta64(id >> 22, "ms"))

2019-09-26T20:52:16.719 と出力される。

逆は次のようにすればよい。例えばタイムスタンプ 2019-09-26 20:52:16 のIDは

t = '2019-09-26 20:52:16'
print((np.datetime64(t) - np.datetime64("2010-11-04 10:42:54.657")).astype(int) << 22)

小さめの値 1177189136855990272 が出力される。

ちなみに、Twitterは2022年5月時点で毎秒1万ツイートほどらしい(How Many Tweets per Day)。ミリ秒あたり10ツイート。22ビットあれば十分なのであろう。