0

C++ で一意の ID を生成する必要があります。1 秒あたり約 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++;
}

明らかに、調整する定数が 2 つあります。このソリューションは、プログラムの中断のない実行中に生成される 1 秒あたりの平均 ID が を超えMAX_IDs_SECた場合には機能しません。そのため、値が十分に高いことを確認するか、この関数の呼び出しを頻繁に抑制する必要があります。

于 2012-12-12T09:04:25.917 に答える
2

1 秒あたり 200 個の ID を生成できるようにし、(ID を繰り返さずに) 生成し続けたい場合は、30 * 24 * 60 * 60 * 200 = 518,400,000 個の ID を生成できる必要があります。ID の長さが 9 桁以上である必要がある場合、各 ID は (10 進表現を使用すると仮定して) 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 が生成され、関数を 1 秒あたり 200 回呼び出すと、30 日以内に繰り返されなくなります。

この 30 日間にプロセスが開始および停止された場合は、プロセスが停止したときに最後に使用された ID をファイルに保存し、プロセスが再開されたときに ID を復元します。

于 2012-12-12T09:01:47.833 に答える