C++ “雪花算法“原理

简介: C++ “雪花算法“原理

C++雪花算法并不是传统的数据结构与算法而是一种崭新的分布式算法  属于深层次C++ 本篇文章就来描述一下雪花算法

什么是雪花算法:

雪花算法(Snowflake)是Twitter开源的一种分布式唯一ID生成算法。它可以在不依赖于数据库等其他存储设施的情况下,生成全局唯一的ID。雪花算法生成的ID是一个64位的长整型数,具体结构如下:

  1. 第1位:符号位,固定为0,表示生成的ID为正数。
  2. 接下来的41位:时间戳(毫秒级),记录了生成ID的时间,可以使用69年。
  3. 然后的10位:机器ID,用于标识不同的机器,可以根据自身需求配置。其中,前5位是机房号,表示最多有32个机房;后5位是机器ID,表示每个机房最多有32台机器。
  4. 最后12位:序列号,用于表示在同一毫秒内生成的多个ID的顺序,支持每台机器每毫秒产生4096个ID。

雪花算法保证了在分布式系统中生成的ID是唯一的、有序的、可排序的,并且不需要依赖于数据库等其他存储设施。同时,雪花算法的高性能、高可用和自增特性,使其在存入数据库中时,索引效率高。

需要注意的是,雪花算法在实际使用时,每台机器需要配置一个唯一的机器ID,以保证生成的ID不与其他机器生成的ID重复。此外,还需要注意时钟回拨的问题,即当本地时钟发生回拨时,可能会导致生成的ID出现重复或者乱序的情况。

snowflake-64bit 组成分析:

分别有三部分(其中第一位保留位,暂时没用):

  1. 第一部分:时间戳(毫秒级),这里为41bit
  2. 第二部分:工作机器id,一般为==5bit数据中心id(datacenterId)+5bit机器id(workerId)==组成,10位的长度最多支持部署1024个节点
  3. 第三部分:在相同毫秒内,可以产生2^12 个id,12位的计数顺序号支持每个节点每毫秒产生4096个ID序列

snowflake-32bit

大致与64bit相同,唯一区别是时间戳部分这里仅占用32bit,因为保存的时间戳为:当前时间戳-雪花算法开始的时间戳,得出来的数据仅用10bit就可以保存,位数越少,对磁盘、数据索引等数据提高越明显  

雪花代码运行过程中逻辑图:

总结:还有利用数据库来生成分布式全局唯一ID方案,不过性能与稳定性都不如snowflake,针对snowflake比较成熟的解决方案可以参考  美团点评分布式ID生成系统。

雪花算法代码实例:

#include <iostream>  
#include <chrono>  
#include <thread>  
#include <random>  
  
// 雪花算法生成的ID的位数  
const int64_t kEpoch = 1609459200000; // 起始时间戳(毫秒级),这里假设为2021-01-01 00:00:00 UTC  
const int64_t kWorkerIdBits = 5;      // 机器ID所占的位数  
const int64_t kDatacenterIdBits = 5;  // 数据中心ID所占的位数  
const int64_t kSequenceBits = 12;    // 序列号所占的位数  
  
// 机器ID和数据中心ID,这些值需要根据实际情况进行配置  
const int64_t kWorkerId = 1;  
const int64_t kDatacenterId = 1;  
  
// 用于生成序列号的随机数生成器  
std::mt19937 gen(static_cast<unsigned int>(time(0)));  
std::uniform_int_distribution<> dis(0, (1 << kSequenceBits) - 1);  
  
// 生成雪花算法ID  
int64_t generateSnowflakeId() {  
    int64_t timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(  
        std::chrono::system_clock::now().time_since_epoch()).count() - kEpoch;  
  
    // 如果当前时间小于上一次生成ID的时间戳,说明系统时钟回退过,应当抛出异常  
    static int64_t lastTimestamp = -1;  
    if (timestamp < lastTimestamp) {  
        throw std::runtime_error("Clock moved backwards. Refusing to generate id for "  
                                 + std::to_string(lastTimestamp - timestamp) + " milliseconds");  
    }  
  
    // 如果是同一时间戳,则进行序列号自增  
    if (lastTimestamp == timestamp) {  
        timestamp = lastTimestamp;  
    } else {  
        // 不同时间戳,序列号置为0  
        sequence = 0;  
    }  
  
    // 上次生成ID的时间截  
    lastTimestamp = timestamp;  
  
    // 移位并通过或运算拼到一起组成64位的ID  
    return ((timestamp << (kWorkerIdBits + kDatacenterIdBits + kSequenceBits)) |  
            (kDatacenterId << (kWorkerIdBits + kSequenceBits)) |  
            (kWorkerId << kSequenceBits) |  
            sequence);  
}  
  
int main() {  
    try {  
        for (int i = 0; i < 10; ++i) {  
            int64_t id = generateSnowflakeId();  
            std::cout << "Generated ID: " << id << std::endl;  
        }  
    } catch (const std::exception& e) {  
        std::cerr << "Exception: " << e.what() << std::endl;  
    }  
  
    return 0;  
}

generateSnowflakeId函数负责生成雪花算法ID。它首先获取当前时间戳,然后检查是否发生了时钟回拨。如果没有回拨,它会根据时间戳、数据中心ID、机器ID和序列号生成一个唯一的64位ID。

好了 本篇文章就到这里结束了 在这里我向大家推荐一个质量高的课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
15天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
63 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
5天前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
40 19
|
23天前
|
算法 Java 数据库
理解CAS算法原理
CAS(Compare and Swap,比较并交换)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相同来决定是否进行更新。JDK 5引入了基于CAS的乐观锁机制,替代了传统的synchronized独占锁,提升了并发性能。然而,CAS存在ABA问题、循环时间长开销大和只能保证单个共享变量原子性等缺点。为解决这些问题,可以使用版本号机制、合并多个变量或引入pause指令优化CPU执行效率。CAS广泛应用于JDK的原子类中,如AtomicInteger.incrementAndGet(),利用底层Unsafe库实现高效的无锁自增操作。
理解CAS算法原理
|
9天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
32 2
|
18天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
16天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
23天前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
41 4
|
1月前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
64 3
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用