0

グローバルな一意の ID を生成するには、作成時のタイムスタンプのようなものが必要です。ただし、これらの ID は、ソース コード内で連続して生成できます。そのため、ミリ秒単位の時間は十分に正確ではなく、意図せずに同じ ID を生成する可能性があります。

したがって、フェッチされるたびに異なるように正確なタイムスタンプが必要です。CPUサイクルについて考えましたが、この情報を取得する方法があるかどうかはわかりません。

これはリアルタイム ゲーム用であるため、タイムスタンプのフェッチはパフォーマンスに関連しています。さらに、Linux、Windows、Mac とのクロスプラットフォーム互換性があるため、もちろんタイムスタンプもそうあるべきです。標準的な方法がなければ、システムの 3 つの特徴的なソリューションで生活できます。

4

1 に答える 1

1

高解像度のタイムソースが保証されていない限り、タイムスタンプはこれにはあまり適していません。一部のシステムにはこれがあり、他のシステムにはありません。

特に、システムに複数の CPU がある場合、各 CPU の「タイムスタンプ カウンター」が同期していない可能性があるため、1 つの CPU のクロックサイクル数が別の CPU のクロックサイクル数よりも「遅れている」という理由だけで重複が発生する可能性があります。

clock_gettimePOSIX システムでは、ナノ秒の分解能を持ち、かなり高速な を使用できる場合があります。

私はそれをテストするためにこのコードを書きました:

#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
    timespec ts[100];

    for(auto &t : ts)
        clock_gettime(CLOCK_REALTIME, &t);
    timespec old_ts = {0};
    for(auto &t : ts)
    {
    long diff = 0;
    if (old_ts.tv_sec)
    {
        diff = t.tv_nsec - old_ts.tv_nsec;
    }
        cout << "ts.nsec: " << t.tv_nsec << " diff=" << diff << endl;
    old_ts = t;
    }
    return 0;
}

編集:

もちろん、一意の ID の最も単純な形式は 64 ビットのアトミック カウンターです。これは最も高速でシンプルです。C++11 の機能があると仮定します。

#include <atomic>

typdef long long int id_type;
std::atomic<id_type> current_id;

id_type get_next_id()
{
   return current_id.fetch_add(1);
}

ビジュアルスタジオにアトミックがあるかどうかはわかりませんが、使用できますInterlockedINcrement64()

InterlockedIncrement64(&current); 
于 2013-08-24T20:38:36.417 に答える