我试图创建一种超市软件,我想出了一个问题。
当我添加客户端时,我立即说它的ID是列表中的下一个,但是如果列表是手动更改的,它将创建重复的ID,所以我试图找到ID的方式下一个可用的ID。但是,如果ID列表是这样的:
6
5
1
2
它将归因于不可用的ID 6 ...
如果向量的完整运行找不到相同的数字,我怎么才能更改它的ID?
ID = clientsV.size() + 1;
for (unsigned int g = 0; i < clientsV.size(); g++)
{
if (ID == clientsV.at(g).getClientID)
ID++;
};
答案 0 :(得分:0)
首先,使用ID的大小确实不是容错的。
一个简洁的概念是使用随机ID,如果随机字段足够大,则碰撞的可能性非常小。
例如,可以使用时间戳MD5或uuid作为ID。除了比重新搜索(希望非常大)客户列表更有效之外,它在扩展时也具有巨大的优势:您没有一个权限可以发布所有组件所依赖的新ID,以便您可以分发通过许多独立服务器创建新客户端。这可能正在解决您尚未拥有的问题,但这是一个很好的未来证明方法
答案 1 :(得分:0)
处理此问题的常用方法是让变量跟踪下一个未使用的ID。例如:
class Client
{
public:
Client() : id_(++s_id_) { }
private:
int id_;
static int s_id_;
};
int Client::s_id_ = 0; // in client.cpp
使用int
- 假设它是32位 - 没有任何检查(如上所述)意味着你在约20亿客户之后开始得到负ids,并且在约40亿之后可能重复,但我认为& #39;不是问题......