0

私はデータベースを作成しており、特定のタイプのすべてのアイテムに一意の ID を割り当てたいと考えています (内部データ管理の目的で)。ただし、データベースは長時間 (理論的には無限) 稼働し、エントリの回転率が高いことが予想されます (エントリが定期的に削除および追加される場合など)。

一意の ID を としてモデル化し、データベース内のエントリが常に(一意の ID として使用できない)unsigned int未満であると仮定すると、次のようなことができます。2^32 - 10

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_PTR32 ビット) を使用しているため、別の解決策を探しています。さらに、データはネットワーク経由で送信され、より小さなサイズの一意の ID を使用して帯域幅の消費を削減しようとしていました。

4

2 に答える 2

6

uint64_t (64 ビット) を使用すると、1 秒あたり 100k エントリに近い場所に挿入したとしても、100 年以上かかります。100 年を超えると、約 315,360,000,000,000 レコードを挿入する必要があります (閏年や閏秒などは考慮しません)。この数値は 49 ビットに収まります。

そのアプリケーションが実行されると予想される時間はどれくらいですか? 100年以上?

これは、自動インクリメント フィールドが 32 ビットの制限に近づいている場合に、データベース管理者がよく行うことです。DBシステムのネイティブ64ビット型(または128ビット)に値を変更します。

于 2013-09-10T11:32:55.703 に答える