0

我需要在 C++ 中生成唯一 ID。我正在查看每秒近 200 个 ID,这些 ID 至少在接下来的 30 天内不应重复。ID 的长度应为 9 或 10 位。如果我的服务重新启动或我的机器重新启动,这些也不应该重复。

我查看了以下链接 生成唯一序列 ID

和我的要求差不多。但我遇到的那段代码的问题是 ID 长度。有时它会生成低至 2 位数的 ID。我向一名测试司机证实了这一点。

您的意见将不胜感激。

4

2 回答 2

3

作为第一个近似值,您可以尝试这样的事情:

unsigned long genUniqueID()
{
  const unsigned long MIN_ID = 1e8; // 9 digit number
  const unsigned long MAX_IDs_SEC = 200;
  static unsigned long nextID = MIN_ID + getSecondsSinceStartOfMonth() * MAX_IDs_SEC;
  return nextID++;
}

显然有两个常数需要调整。如果在程序不间断运行期间每秒生成的平均 ID 超过MAX_IDs_SEC,则此解决方案将不起作用,因此您需要确保该值足够高,否则会过于频繁地调用此函数。

于 2012-12-12T09:04:25.917 回答
2

如果您希望能够每秒生成 200 个 ID,并且希望继续这样做(不重复 ID),则需要能够生成 30 * 24 * 60 * 60 * 200 = 518,400,000 个 ID。如果 ID 至少应为 9 位长,则每个 ID 应(假设您使用十进制表示)大于或等于 100,000,000(最小的 9 位数字)。

因此,理想情况下,您应该有一个函数返回一个类型的值,该类型可以保存 100,000,000 到 618,400,000 之间的值。这两个值都小于最大的无符号 32 位值 (4,294,967,295),因此您可以使用它:

static uint32_t getNextId() {
  static uint32_t lastId = 99999999;
  return ++lastId;
}

继续调用这个函数,它会在每次调用时产生一个新的 ID,如果你每秒调用 200 次,它们不会在 30 天内重复。

如果您的进程在这 30 天内启动和停止,只需在进程停止时将上次使用的 ID 保存到文件中,并在进程再次启动时恢复 ID。

于 2012-12-12T09:01:47.833 回答