MongoDB の ObjectID は、ドキュメントを挿入すると自動的に生成される ID で、挿入データと一緒に保存される。
本書では、この ObjectID が保有している情報と、構成(生成規則)を説明していく。
ObjectId は12バイトで構成され、各値は以下のとおり。(公式サイトより)
- 4バイトのUnixエポックからの経過秒数
- 3バイトのマシン識別子
- 2バイトのプロセスID
- 3バイトの初期値がランダムなカウンター
OjbectID は ID というだけあって、当然ユニークなのだが、正確には「ユニークの可能性が高い」ということらしい。
詳細は、以下のサイトに委ねるが、大まかに幾つかピックアップすると、
mongodb – 重複するMongo ObjectIdが2つの異なるコレクションで生成される可能性はありますか?
- カウンタオーバーフロー
カウンタに3バイトあります。16,777,216(2 ^ 24)個の文書を1秒間に同じマシン上に挿入した場合 - カウンター非インクリメント
いくつかのMongoDBドライバーはカウンターバイトの数を増やす代わりに乱数を使用する。このような場合、1 / 16,777,216のチャンスがあるが、これらの2つのIDが同じ秒で生成された場合(IDの時刻セクションが次の秒に更新される前)。 - マシンとプロセスハッシュを同じ値にする
同時に2つの異なるマシン上の2つのカウンタが同じ秒で同じ値を生成する場合
ということで、ユニークな可能性が非常に高く、実質的にユニークとみなして良いという感じ。
以上