Files
NP_Midterm/impl/Utils/GenerateID.cpp

35 lines
903 B
C++

#include "Utils/Snowflake.hpp"
namespace Chattr {
Snowflake GenerateID() {
static struct EpochInitializer {
EpochInitializer() {
EPOCH = std::chrono::system_clock::now();
}
std::chrono::system_clock::time_point EPOCH;
} epochInitializer;
static std::mutex snowflakeGenerateMutex_;
std::lock_guard<std::mutex> lock(snowflakeGenerateMutex_);
std::size_t tid;
#ifdef _WIN32
tid = static_cast<std::size_t>(GetCurrentThreadId());
#elif __linux__
tid = static_cast<std::size_t>(pthread_self());
#endif
thread_local static int sequence = 0;
Snowflake id = {};
auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - epochInitializer.EPOCH);
id.timestamp = timestamp.count();
id.instance = tid;
id.sequence = sequence++;
return id;
}
};