⚡
【Go】IDの生成【Xid】
DBによる採番と問題
一意なIDの生成は、例えばDBのAUTOINCREMENT
に任せることで簡単に行うことができる。
しかしながら、そういうアプローチが取れない場合や、技術的な制約が存在する場合もある。
- 何らかの理由でデータベースと通信ができない場合
- 複数DBにまたがって採番する場合(IDの重複)
- 保存前にエンティティのIDを確定できない問題も
- 事前採番はI/O回数が増えてしまう
ランダムなID
UUIDのコンセプトは30年以上前からあるそう。現在は仕様としてはv1~v5まであり、よく使われるのはv1かv4あたり。
IDに求められる要件
- システム上で一意であること(当然だが、分散されたシステムであったとしても一意となるべき)
- ソート可能であること
- 時間クラスタ化されており、同じ時間に生成されたIDはソートされたときに互いに近接していること
- エスケープせずにURLの一部として使用可能であること
- 短ければ短いほど良い
Xid
- 時間をIDの一部として使用してIDを生成することができる。
- ソート可能かつurl-safeな文字列として表現できる。
- 生成されたIDは 12bytes / 20文字
※他にも同様の要件を満たすパッケージはある
Discussion