Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
唯一的10位序列ID-200 ID/秒 我需要在C++中生成唯一的ID。我每秒查看200个ID,这些ID至少在接下来的30天内不会重复。ID的长度应为9或10位。 如果我的服务重新启动或我的机器重新启动,这些操作也不应该重复_C++ - Fatal编程技术网

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

唯一的10位序列ID-200 ID/秒 我需要在C++中生成唯一的ID。我每秒查看200个ID,这些ID至少在接下来的30天内不会重复。ID的长度应为9或10位。 如果我的服务重新启动或我的机器重新启动,这些操作也不应该重复,c++,C++,我查看了以下链接 这几乎和我的要求一样。 但我面临的问题是代码的ID长度。 有时它会生成低至2位的ID。 我和一位试驾员确认了这一点 非常感谢您的输入。如果您希望每秒生成200个ID,并且希望继续这样做(不重复ID),则需要能够生成30*24*60*60*200=518400000个ID。如果一个ID的长度至少为9位,则每个ID的长度(假设使用十进制表示法)应大于或等于100000000(9位的最小数字) 因此,理想情况下,您应该有一个返回类型值的函数,该类型值可以保存100000000到61

我查看了以下链接

这几乎和我的要求一样。 但我面临的问题是代码的ID长度。 有时它会生成低至2位的ID。 我和一位试驾员确认了这一点


非常感谢您的输入。

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

因此,理想情况下,您应该有一个返回类型值的函数,该类型值可以保存100000000到618400000之间的值。这两个值都小于最大的无符号32位值(4294967295),因此您可以使用:

static uint32_t getNextId() {
  static uint32_t lastId = 99999999;
  return ++lastId;
}
继续调用这个函数,每次调用都会产生一个新的ID,如果你每秒调用这个函数200次,它们在30天内不会重复


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

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

因此,理想情况下,您应该有一个返回类型值的函数,该类型值可以保存100000000到618400000之间的值。这两个值都小于最大的无符号32位值(4294967295),因此您可以使用:

static uint32_t getNextId() {
  static uint32_t lastId = 99999999;
  return ++lastId;
}
继续调用这个函数,每次调用都会产生一个新的ID,如果你每秒调用这个函数200次,它们在30天内不会重复


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

作为第一种近似方法,您可以尝试以下操作:

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\u IDs\u SEC
,则此解决方案将不起作用,因此您需要确保该值足够高,或者过于频繁地调用此函数。

作为第一种近似方法,您可以尝试以下操作:

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\u IDs\u SEC
,则此解决方案将不起作用,因此您需要确保该值足够高,或者太频繁地调用此函数。

我想您是否尝试过在每次需要新ID时简单地将变量递增一?您可以通过在退出之前将当前ID保存到一个文件中,然后在启动时读取它来处理服务/计算机重新启动的情况。@Insilico->yes,我考虑过了。但万一发生崩溃,或者突然重启,这将是一个折腾。我想您已经尝试过在每次需要一个新ID时简单地将一个变量递增一?您可以通过在退出之前将当前ID保存到一个文件中,然后在启动时读取它来处理服务/计算机重新启动的情况。@Insilico->yes,我考虑过了。但如果发生崩溃或突然重新启动,这将是一个折腾。这是一个良好的开始,但在他重新启动服务时会重新启动。@RedX:对,这就是我写最后一段的原因。@FrerichRaabe->我唯一的疑问是,如果服务不能正常退出怎么办?我该如何处理这个错误场景?这是一个很好的开始,但当他重新启动服务时,这将重新启动。@RedX:对,这就是我写最后一段的原因。@FrerichRaabe->我唯一的疑问是,如果服务不能正常退出怎么办?如何处理该错误场景?+1:我喜欢将系统时间合并到ID中的想法,这样您就可以在不存储ID的情况下重新启动流程。但是,使用从月初开始的秒数可能会导致ID被重用(假设函数在1月1日被调用,然后进程停止,并在1月1日和2月1日再次重新启动)@FrerichRaabe如果它在2月1日重新启动,那么我们在1月1日分配了一些ID已经30天了,所以我们没事。如果程序可以在不到一秒钟的时间内重新启动,那么你可以用
MIN\u ID+getmillissecondssincestartofMonth()之类的东西初始化
nextID
。我严重怀疑此进程的重新启动速度是否会超过1ms,并且
MAX_ID_SEC
将隐含1000,这远远高于OP的预期负载。@SchighSchagh->如果我每秒生成200个ID,这将如何唯一?MIN_ID,getSecondsSinceStartOfMonth()&MAX_IDs_SEC..在特定的时刻,这三个变量的值都是相同的,对吗?@PraveenKeshavamurthy您知道
静态
变量在函数内部是如何工作的吗?
nextID
将在第一次调用函数时按指定进行初始化。在后续调用中,
静态
变量不会重新初始化tialized。相反,它保留上次函数返回时的值。由于
++
,变量
nextID
下次调用时将包含不同的数字,