32 lines
777 B
C++
32 lines
777 B
C++
#include "Utils/Snowflake.hpp"
|
|
|
|
namespace Chattr {
|
|
|
|
Snowflake GenerateID() {
|
|
static struct _EPOCH {
|
|
_EPOCH() {
|
|
EPOCH = std::chrono::system_clock::now();
|
|
}
|
|
std::chrono::system_clock::time_point EPOCH;
|
|
} __EPOCH__;
|
|
|
|
static std::mutex snowflakeGenerateMutex_;
|
|
|
|
std::lock_guard<std::mutex> lock(snowflakeGenerateMutex_);
|
|
#ifdef _WIN32
|
|
DWORD tid = GetCurrentThreadId();
|
|
#elif __linux__
|
|
pthread_t tid = pthread_self();
|
|
#endif
|
|
static int sequence = 0;
|
|
Snowflake id = {};
|
|
|
|
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - __EPOCH__.EPOCH);
|
|
id.timestamp = timestamp.count();
|
|
id.instance = tid;
|
|
id.sequence = sequence++;
|
|
|
|
return id;
|
|
}
|
|
|
|
}; |