私はデータベースを作成しており、特定のタイプのすべてのアイテムに一意の ID を割り当てたいと考えています (内部データ管理の目的で)。ただし、データベースは長時間 (理論的には無限) 稼働し、エントリの回転率が高いことが予想されます (エントリが定期的に削除および追加される場合など)。
一意の ID を としてモデル化し、データベース内のエントリが常に(一意の ID として使用できない)unsigned int
未満であると仮定すると、次のようなことができます。2^32 - 1
0
void GenerateUniqueID( Object* pObj )
{
static unsigned int iCurrUID = 1;
pObj->SetUniqueID( iCurrUID++ );
}
ただし、エントリが削除されて別のエントリが追加されるまでは、これで問題ありません。まだエントリが少ない可能性があり2^32-1
ますが、オーバーフローして、iCurrUID
既に使用されている「一意の」ID が割り当てられる可能性があります。
私が持っていた 1 つのアイデアは、を使用しstd::bitset<std::numeric_limits<unsigned int>::max-1>
、それをトラバースして最初の無料の一意の ID を見つけることでしたが、これはメモリ消費量が多く、無料の一意の ID を見つけるには線形の複雑さが必要になるため、より良い方法を探しています。存在しますか?
前もって感謝します!
データ型を 32 ビット整数ではなく 64 ビット整数に変更すると問題が解決することはわかっています。ただし、私は Win32 環境で作業しており、リスト ( DWORD_PTR
32 ビット) を使用しているため、別の解決策を探しています。さらに、データはネットワーク経由で送信され、より小さなサイズの一意の ID を使用して帯域幅の消費を削減しようとしていました。