我需要在c ++中生成唯一ID。我正在查看每秒近200个ID,这些ID在接下来的30天内不应重复。 ID应为9或10位数。 如果我的服务重新启动或我的机器重新启动,也不应重复这些。
我检查了以下链接 Generate unique sequence ID
这与我的要求差不多。 但我面对这段代码的问题是ID长度。 有时它曾经生成低至2位数的ID。 我用测试驱动程序证实了这一点。
非常感谢您的投入。
答案 0 :(得分: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
,则此解决方案将无效,因此您需要确保该值足够高,否则会过于频繁地调用此函数。 / p>
答案 1 :(得分: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。