Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

ULIDはタイムスタンプ領域を使い切ったらどうなるのか

ULIDのような時間で並び替えられるIDは便利ですよね。

github.com

スペックによると、48ビットがタイムスタンプ領域だそうです。これを使い切るのは 10889年だとも書いてあります。

これを使い切った後どうなるのかが気になったので、調べてみましたが、スペックには書いていなさそうでした。

なので、リファレンス実装っぽいJavaScriptの実装を参照してみると・・・

TIME_MAXという定数が定義されていて、これは 281474976710655 で、10889-08-02 14:31:50.655だそうです。

const TIME_MAX = Math.pow(2, 48) - 1

https://github.com/ulid/javascript/blob/a5831206a11636c94d4657b9e1a1354c529ee4e9/lib/index.ts#L23

そして、これを超えた値が入ってきた時には、エラーが発生するようでした。

if (now > TIME_MAX) {
  throw createError("cannot encode time greater than " + TIME_MAX)
}

https://github.com/ulid/javascript/blob/a5831206a11636c94d4657b9e1a1354c529ee4e9/lib/index.ts#L70-L72

ということで、10889年にはID生成時にエラーが発生するようです。考えなくていいですね。