我正在编写一个数据库,我希望为特定类型的每个项目分配一个唯一 ID(用于内部数据管理)。但是,预计数据库将运行很长时间(理论上无限),并且条目的周转率很高(例如定期删除和添加条目)。
如果我们将我们的唯一 ID 建模为unsigned int
,并假设数据库中的条目总是少于2^32 - 1
(我们不能0
用作唯一 ID),我们可以执行以下操作:
void GenerateUniqueID( Object* pObj )
{
static unsigned int iCurrUID = 1;
pObj->SetUniqueID( iCurrUID++ );
}
但是,在开始删除条目并在其位置添加其他条目之前,这很好,可能仍然少于2^32-1
条目,但我们可能会溢出iCurrUID
并最终分配已经被使用的“唯一”ID。
我的一个想法是使用 astd::bitset<std::numeric_limits<unsigned int>::max-1>
然后遍历它来找到第一个免费的唯一 ID,但这会消耗大量内存并且需要线性复杂度才能找到一个免费的唯一 ID,所以我正在寻找一种更好的方法,如果一个存在吗?
提前致谢!
我知道将数据类型更改为 64 位整数而不是 32 位整数可以解决我的问题;但是,因为我在 Win32 环境中工作,并且使用列表(DWORD_PTR
32 位),所以我正在寻找替代解决方案。此外,数据是通过网络发送的,我试图通过使用较小的唯一 ID 来减少带宽消耗。