代码之家  ›  专栏  ›  技术社区  ›  Afonso Ramos

算法-检查编号是否已在列表中

  •  0
  • Afonso Ramos  · 技术社区  · 8 年前

    我正在尝试创建一种超市软件,但我遇到了一个问题。

    当我添加一个客户端时,我立即说它的ID是列表上的下一个ID,但是如果手动更改列表,它会创建重复的ID,所以我试图找到一种方法让ID成为下一个可用的ID。但是,如果ID列表是这样的:

    6.

    5.

    1.

    2.

    它将属性ID 6,该ID不可用。。。

    如果向量的完整运行没有找到相等的数字,我怎么才能更改它的ID?

    ID = clientsV.size() + 1;
    for (unsigned int g = 0; i < clientsV.size(); g++)
        {
            if (ID == clientsV.at(g).getClientID)
            ID++;
        };
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   akiva    8 年前

    首先,使用ID的大小确实是不容错的。

    一个简洁的概念是使用随机ID,如果随机字段足够大,则发生碰撞的可能性非常小。

    例如,可以使用时间戳 MD5 uuid 作为ID。除了比重新搜索(希望是非常大的)客户机列表更高效之外,它在扩展时还有一个巨大的优势:您没有一个颁发所有组件都依赖的新ID的权限,这样您就可以在许多独立的服务器上分发新客户机的创建。

    这可能解决了一个你还没有解决的问题,但这是一个很好的经得起未来考验的方法

        2
  •  0
  •   Tony Delroy    8 年前

    处理此问题的常见方法是使用变量跟踪下一个未使用的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亿个客户端后可能会出现重复,但我认为这不是问题。。。。