算法 - 检查号码是否已在列表中
Algorithm - Checking if number is already on list
我正在尝试创建一种超市软件,但遇到了一个问题。
当我添加一个客户端时,我会立即说它的 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++;
};
首先,ID用size确实不能容错
一个简洁的概念是使用随机 ID,如果您的随机字段足够大,则发生冲突的可能性非常小。
例如,可以使用时间戳的 MD5 or uuid 作为 ID。除了比重新搜索(希望非常大的)客户列表更有效之外,它在扩展时也有一个巨大的优势:您没有一个权威机构可以发布所有组件都依赖的新 ID,以便您可以分发在许多孤立的服务器上创建新客户端。
这可能会解决您还没有遇到的问题,但这是一个很好的面向未来的方法
处理此问题的常用方法是让变量跟踪下一个未使用的 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 亿客户之后开始获得负 ID,并且在大约 40 亿之后可能重复,但我认为这不是问题....
我正在尝试创建一种超市软件,但遇到了一个问题。
当我添加一个客户端时,我会立即说它的 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++;
};
首先,ID用size确实不能容错
一个简洁的概念是使用随机 ID,如果您的随机字段足够大,则发生冲突的可能性非常小。
例如,可以使用时间戳的 MD5 or uuid 作为 ID。除了比重新搜索(希望非常大的)客户列表更有效之外,它在扩展时也有一个巨大的优势:您没有一个权威机构可以发布所有组件都依赖的新 ID,以便您可以分发在许多孤立的服务器上创建新客户端。
这可能会解决您还没有遇到的问题,但这是一个很好的面向未来的方法
处理此问题的常用方法是让变量跟踪下一个未使用的 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 亿客户之后开始获得负 ID,并且在大约 40 亿之后可能重复,但我认为这不是问题....