首页 > 编程语言 >Code-C++-Snowflake

Code-C++-Snowflake

时间:2023-10-12 12:55:05浏览次数:38  
标签:std Code sequence timestamp C++ int64 static Snowflake

Code-C++-Snowflake

#include <iostream>
#include <chrono>
#include <stdexcept>
 
class Snowflake {
private:
    // 雪花算法的各个参数
    static constexpr int64_t workerIdBits = 5;
    static constexpr int64_t datacenterIdBits = 5;
    static constexpr int64_t sequenceBits = 12;
 
    static constexpr int64_t maxWorkerId = -1 ^ (-1 << workerIdBits);
    static constexpr int64_t maxDatacenterId = -1 ^ (-1 << datacenterIdBits);
    static constexpr int64_t sequenceMask = -1 ^ (-1 << sequenceBits);
 // sequenceMask =0b111111111111
    int64_t workerId;
    int64_t datacenterId;
    int64_t sequence = 0;
    int64_t lastTimestamp = -1;
 
public:
    Snowflake(int64_t workerId, int64_t datacenterId)
            : workerId(workerId), datacenterId(datacenterId) {}
 
    int64_t generateId() {
        // 获取当前时间戳(毫秒级)
        auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
                std::chrono::system_clock::now().time_since_epoch()).count();
 
        if (timestamp < lastTimestamp) {
            throw std::runtime_error("Invalid system clock!");
        }
 
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = waitNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0;
        }
 
        lastTimestamp = timestamp;
 
        // 生成最终的唯一ID
        int64_t uniqueId = (timestamp << (workerIdBits + datacenterIdBits + sequenceBits)) |
                           (datacenterId << (workerIdBits + sequenceBits)) |
                           (workerId << sequenceBits) |
                           sequence;
        return uniqueId;
    }
 
private:
    int64_t waitNextMillis(int64_t lastTimestamp) {
        auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
                std::chrono::system_clock::now().time_since_epoch()).count();
        while (timestamp <= lastTimestamp) {
            timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(
                    std::chrono::system_clock::now().time_since_epoch()).count();
        }
        return timestamp;
    }
};
 
int main() {
    Snowflake snowflake(1, 1);
    for (int i = 0; i < 10; i++) {
        int64_t uniqueId = snowflake.generateId();
        std::cout << uniqueId << std::endl;
    }
 
    return 0;
}

标签:std,Code,sequence,timestamp,C++,int64,static,Snowflake
From: https://www.cnblogs.com/yongchao/p/17759247.html

相关文章

  • 堪比Copilot平替?亚马逊云科技Amazon CodeWhisperer在开发效率提升上究竟如何
    说明 GitHubcopilot虽然很强,但是每个月的使用金额并不低,而亚马逊云科技AmazonCodeWhisperer免费支持多种编程语言的AI编程,甚至被网友称为GitHubcopilot平替?!  工具安装 如果你已经有vscode请忽略本章节,以python为例,安装python环境,把这个链接复制到浏览器下载python,注意操作系......
  • C++ 11 Lambda表达式
    C++11Lambda表达式 C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......
  • 一个 hashCode() 函数引发的​「​惨案」
    1、起因让我关注到这一点的起因是一道题:牛客网上的max-points-on-a-line(答题:https://www.nowcoder.com/practice/bfc691e0100441cdb8ec153f32540be2)题目是这么描述的:Givennpointsona2Dplane,findthemaximumnumberofpointsthatlieonthesamestraightline.大意就......
  • C++11新特性之基本范围的For循环(range-based-for)
    C++11新特性之基本范围的For循环(range-based-for)最新推荐文章于 2023-07-2219:30:58 发布Rayen0715于2017-01-0713:49:35发布49588收藏174版权Range-Based-For熟悉C++98/......
  • 关于vscode编写qt,qdebug无法输出到终端的问题
    这个问题主要是cmake那边的qt设置没弄好。其中WIN32_EXECUTABLEON。这个选项要设置为OFF。不然qdebug无法打印到终端中。如果本来就没有这set_target_properties的话,可以在cmake最后一行加上这个,并且将WIN32_EXECUTABLEON设置为OFF即可。set_target_properties(appl......
  • C++异步定时器设计与实现
    C++异步定时器设计与实现由于目前C++标准中没有现成的定时器,本设计使用C++11相关语法并进行封装。本定时器包含一个TimerManager类用于创建定时器和进行定时任务管理,TimerManager会创建两个线程(mTimerTickThread、mTimerCallbackThread)分别用于时间处理和函数回调。可以使用Ti......
  • eslint vscode 配置文件
    { "settingsSync.ignoredSettings":[], "vetur.validation.template":false, "workbench.iconTheme":"vscode-icons", "workbench.colorTheme":"OceanicNext", "settingsSync.ignoredExtens......
  • C# Dev Kit for Visual Studio Code
    VisualStudioCode安装C#开发工具包并编写ASP.NETCoreWeb应用 前言前段时间微软发布了适用于VSCode的C#开发工具包(注意目前该包还属于预发布状态但是可以正常使用),因为之前看过网上的一些使用VSCode搭建.NETCore环境的教程看着还挺复杂的就一直没有尝试使用VSCode......
  • json_encode return false
    json_encodereturnfalse怎么办if(!json_encode($result,JSON_PARTIAL_OUTPUT_ON_ERROR)){ var_dump(json_last_error());//打印上一次的错误代码:int(5) //所有字符串数据的编码必须是UTF-8。 //mb_convert_encoding($str,"UTF-16");//把字符串转为utf-16编码 echo......