35 lines
851 B
C++
35 lines
851 B
C++
#include "utils/snowflake.h"
|
|
|
|
#include <thread>
|
|
|
|
namespace utils {
|
|
|
|
static struct EpochInitializer {
|
|
EpochInitializer() { EPOCH = std::chrono::system_clock::now(); }
|
|
std::chrono::system_clock::time_point EPOCH;
|
|
} epochInitializer;
|
|
|
|
Snowflake GenerateID(std::uint16_t instance) {
|
|
static std::mutex snowflakeGenerateMutex_;
|
|
|
|
std::lock_guard<std::mutex> lock(snowflakeGenerateMutex_);
|
|
|
|
std::size_t tid =
|
|
std::hash<std::thread::id>{}(std::this_thread::get_id());
|
|
instance = instance << 3;
|
|
tid += instance;
|
|
|
|
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;
|
|
}
|
|
|
|
}; // namespace Chattr
|