【Go】IDの生成【Xid】

2023/03/09に公開

DBによる採番と問題

一意なIDの生成は、例えばDBのAUTOINCREMENTに任せることで簡単に行うことができる。
しかしながら、そういうアプローチが取れない場合や、技術的な制約が存在する場合もある。

  • 何らかの理由でデータベースと通信ができない場合
  • 複数DBにまたがって採番する場合(IDの重複)
  • 保存前にエンティティのIDを確定できない問題も
    • 事前採番はI/O回数が増えてしまう

ランダムなID

UUIDのコンセプトは30年以上前からあるそう。現在は仕様としてはv1~v5まであり、よく使われるのはv1かv4あたり。

https://en.wikipedia.org/wiki/Universally_unique_identifier

IDに求められる要件

  • システム上で一意であること(当然だが、分散されたシステムであったとしても一意となるべき)
  • ソート可能であること
  • 時間クラスタ化されており、同じ時間に生成されたIDはソートされたときに互いに近接していること
  • エスケープせずにURLの一部として使用可能であること
  • 短ければ短いほど良い

Xid

  • 時間をIDの一部として使用してIDを生成することができる。
  • ソート可能かつurl-safeな文字列として表現できる。
  • 生成されたIDは 12bytes / 20文字

https://github.com/rs/xid

※他にも同様の要件を満たすパッケージはある

Discussion