基于C++雪花算法工具类Snowflake -来自chatGPT

简介: 基于C++雪花算法工具类Snowflake -来自chatGPT
#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);
 
    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;
}

在上面的代码中,我们使用C++编写了一个名为Snowflake的类,用于生成Snowflake算法的唯一ID。主要属性和方法如下:


  • Snowflake(int64_t workerId, int64_t datacenterId):构造函数,用于初始化Snowflake算法的参数,包括工作节点ID(workerId)和数据中心ID(datacenterId)。
  • int64_t generateId():生成下一个唯一ID的方法。
  • int64_t waitNextMillis(int64_t lastTimestamp):阻塞到下一个毫秒,直到获得新的时间戳。

在主函数main()中,我们创建了一个Snowflake实例,并使用其generateId()方法生成了10个唯一ID,并将其打印到控制台上。

相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
让非算法同学也能了解 ChatGPT 等相关大模型
让非算法同学也能了解 ChatGPT 等相关大模型
让非算法同学也能了解 ChatGPT 等相关大模型
|
1月前
|
算法 C++ 容器
C++标准库中copy算法的使用
C++标准库中copy算法的使用
17 1
|
2月前
|
数据采集 编解码 人工智能
破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍
【7月更文挑战第19天】DeepMind的JEST算法革新AI训练,提升效率13倍,节能10倍。通过联合数据批次选择,预训练指导及多分辨率训练,优化资源利用,降低能耗。实验显示性能提升,达到SOTA水平,但实施需大量资源,依赖优质参考模型。[论文链接](https://arxiv.org/pdf/2406.17711)
53 10
|
1月前
|
算法 搜索推荐 C++
c++常见算法
C++中几种常见算法的示例代码,包括查找数组中的最大值、数组倒置以及冒泡排序算法。
16 0
|
2月前
|
人工智能 边缘计算 算法
破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍
【7月更文挑战第20天】DeepMind unveils Switch Transformer, revolutionizing AI energy consumption. This novel algorithm boosts training efficiency by 13x and slashes energy use by 10x compared to ChatGPT, marking a significant leap towards eco-friendly AI.
36 2
|
2月前
|
算法 数据库
|
1月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
2月前
|
文字识别 算法 Java
文本,保存图片09,一个可以用id作为图片名字的pom插件,利用雪花算法生成唯一的id
文本,保存图片09,一个可以用id作为图片名字的pom插件,利用雪花算法生成唯一的id
|
2月前
|
搜索推荐 算法 C++
|
2月前
|
存储 算法 Serverless