学习笔记9:雪花算法

雪花算法

雪花算法(Snowflake Algorithm)是一种生成唯一ID的算法,最初由Twitter开发。它的主要特点是生成的ID是64位的长整型数字,具有以下特性:

  1. 唯一性:每个生成的ID都是唯一的。
  2. 趋势递增:生成的ID是递增的,可以作为时间戳使用。
  3. 去中心化:可以在多个节点上生成ID,而不需要集中式协调。

雪花算法的基本结构

雪花算法生成的ID由以下几部分组成:

  • 1位:未使用,始终为0。
  • 41位:时间戳(毫秒级),表示从某个特定时间点(如2010年)开始的时间。
  • 10位:机器ID,用于区分不同的机器或服务实例。
  • 12位:序列号,用于同一毫秒内生成多个ID。

雪花算法的C++实现

以下是一个简化版的C++实现示例:

#include <iostream>
#include <chrono>
#include <cstdint>
#include <cstring>class Snowflake {
private:static const int64_t EPOCH = 1288834974657L; // 起始时间点,Twitter的起始时间点是2010-11-04static const int64_t WORKER_ID_BITS = 10; // 机器ID所占位数static const int64_t MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); // 机器ID最大值static const int64_t SEQUENCE_BITS = 12; // 序列号所占位数static const int64_t SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS); // 序列号掩码static const int64_t WORKER_ID_SHIFT = SEQUENCE_BITS; // 机器ID左移位数static const int64_t TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 时间戳左移位数static const int64_t MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1; // 序列号最大值static const int64_t TWEPOCH = 687888001L; // 以Twitter的起始时间点为例int64_t workerId; // 机器IDint64_t sequence; // 序列号int64_t lastTimestamp; // 上次生成ID的时间戳public:Snowflake(int64_t workerId) : workerId(workerId), sequence(0), lastTimestamp(-1) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw std::invalid_argument("Worker ID must be between 0 and 1023");}}int64_t nextId() {int64_t timestamp = timeGen();if (timestamp < lastTimestamp) {throw std::runtime_error("Clock moved backwards. Refusing to generate id for this time.");}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - EPOCH) << TIMESTAMP_LEFT_SHIFT) |(workerId << WORKER_ID_SHIFT) |sequence;}private:int64_t tilNextMillis(int64_t lastTimestamp) {int64_t timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}int64_t timeGen() {return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() + TWEPOCH;}
};int main() {Snowflake snowflake(1); // 假设机器ID为1for (int i = 0; i < 10; ++i) {std::cout << "ID: " << snowflake.nextId() << std::endl;}return 0;
}

说明

  1. 时间戳:使用std::chrono库获取当前时间戳,并加上一个起始时间点(Twitter的起始时间点是2010-11-04)。
  2. 机器ID:在构造函数中传入,用于区分不同的机器或服务实例。
  3. 序列号:每次生成ID时递增,同一毫秒内最多生成4096个ID(2^12)。
  4. ID生成:通过按位运算组合时间戳、机器ID和序列号生成最终的ID。

这个实现是线程安全的,每次调用nextId方法会生成一个新的ID。注意,这个实现依赖于系统时钟,如果系统时钟回拨,可能会导致生成重复的ID。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫小项目实战

1.自动获取小说多个章节内容 2.获取英雄联盟里面的全部英雄 3. 简单地自动抽奖系统 4. 简单地点赞系统 5. 制作查询手机号工具 6. 制做登录系统 7. 操作excel办公自动化 8. 自动批量保存图片 9. 获取NBA数据 10. 获取彩票信息 11. 获取房地产信息 12. 获取小说…

opencascade AIS_Manipulator源码学习

前言 AIS_Manipulator 是 OpenCASCADE 库中的一个类&#xff0c;用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式&#xff0c;使用户可以通过鼠标进行平移、缩放和旋转等操作。 详细功能 交互对象类&#xff0c;通过鼠标操控另一个交互对象…

git 操作汇总【迭代更新中】

文章目录 0x1初始化操作0x11 生成公钥0x12 配置账号和邮箱 0x20x21 拉取代码0x22 推送代码0x23 设置远端分支 0x30x31 提交mr 0x40x41 子模块0x42 子模块添加 0x1初始化操作 0x11 生成公钥 ssh-keygen0x12 配置账号和邮箱 git config --global user.name username git confi…

瀚高数据库初级考试认证

pg_dumpall可以转储全局角色和表空间信息 单选题2分 A. 是 B. 否 回答正确(2分) 答案&#xff1a; A 解析&#xff1a;pg_dumpall备份一个给定集簇中的每一个数据库&#xff0c;并且也保留了集簇范围的数据&#xff0c;如角色和表空间定义。 2. 自定义文件格式必须与pg_restore…

【网络安全】构建稳固与安全的网络环境:从“微软蓝屏”事件中汲取的教训

发生什么事了&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技术公司“众击”提供的一个…

用uniapp 及socket.io做一个简单聊天app1

####相关的表结构&#xff0c;用的是mysql 用户表&#xff08;Users&#xff09; 存储用户的基本信息。 CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,created_a…

Layui Selcet选择框动态选择问题

前言 时隔多日我也是重新回归写作&#xff0c;高考已经完毕&#xff0c;我将继续我的文章创作&#xff0c;今天我将分享的是我在开发我自己的一个新项目所遇到的问题&#xff0c;这里预告一下我的新项目: VitaApi管理系统 这个系统可以看作是萌新源api管理系统的延续&#xff…

前端学习6——自学习梳理

dom操作&#xff1a;让js和Html真正交互起来 dom&#xff08;document object model&#xff09; 内含利用dom操作进行河北大学网页的简单设计() <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&qu…

FreeBSD掉电导致ZFS无法识别,无法启动系统

一台FreeBSD系统的机器&#xff0c;前段时间刚刚新加载了第二快硬盘&#xff0c;具体操作见&#xff1a;FreeBSD在zfs挂接第二块ssd 硬盘_zfs不能attach附加硬盘-CSDN博客 问题&#xff1a;FreeBSD在一次掉电后&#xff0c;系统无法启动 启动时显示 FreeBSD/x86 boot Defau…

网络战时代的国家安全:策略、技术和国际合作

网络战时代的国家安全涉及到策略、技术和国际合作等多个方面。以下是对这些问题的简要概述&#xff1a; 网络战策略 网络战策略是指在现代战争中&#xff0c;通过网络技术进行的信息收集、处理、分析、调度和指挥等一系列行动&#xff0c;旨在同时影响和干扰对方的网络系统&am…

HarmonyOS鸿蒙应用开发-ZRouter让系统路由表变得更简单

介绍 ZRouter是基于Navigation系统路由表和Hvigor插件实现的动态路由方案。 系统路由表是API 12起开始支持的&#xff0c;可以帮助我们实现动态路由的功能&#xff0c;其目的是为了解决多个业务模块&#xff08;HAR/HSP&#xff09;之间解耦问题&#xff0c;从而实现业务的复…

【前端】[Spring] Spring Web MVC基础理论

[Spring] Spring Web MVC基础理论 Spring Web MVC&#xff08;简称Spring MVC&#xff09;是Spring框架中用于构建Web应用程序的一个模块&#xff0c;它实现了MVC&#xff08;Model-View-Controller&#xff09;设计模式。以下是对Spring Web MVC基础理论的详细解释&#xff1…

Redis高可用技术之持久化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是一年有多少秒可以提供正常服务&#xff08;99.9%、99.99%、99.999%等&#xff09;。但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

【CSS】响应式设计

响应式设计是指通过⼀些技术⼿段&#xff0c;使得⽹站或应⽤在不同终端设备&#xff08;如桌⾯电脑、平板电脑、⼿机等&#xff09;上能够⾃适应地呈现最佳的⽤户体验。 ⼀种实现⽅式是使⽤流体⽹格布局和百分⽐尺⼨等技术&#xff0c;以便根据设备屏幕的宽度和⾼度等信息⾃适…

ubuntu24.04中Osdlyrics报错:canberra-gtk-module和daemon: GDBus.Error:org

OSD Lyrics 是一个桌面应用程序&#xff0c;用于查看与各种媒体播放器兼容的歌词&#xff08;比如Linux下最好的音乐播放器&#xff1a;audacious&#xff09;。它不是一个插件&#xff0c;而是一个独立的程序。OSD Lyrics在您的桌面上显示歌词&#xff0c;风格类似于KaraOK。它…

MySQL InnoDB事务隔离和并发控制面试题详解

1. 为什么 MySQL 使用 B+ 树作为索引而不是 B 树? MySQL 选择使用 B+ 树作为索引主要有以下几个原因: 减少 IO 次数,提高效率:B+ 树的所有数据都存储在叶子节点,非叶子节点只存储索引,树的高度较低,因此查找路径较短,减少了磁盘 IO 次数。查询效率更加稳定:由于数据仅…

Hyper-V 安装 CentOS 8.5

前言 Hyper-V安装文档:在 Windows 10 上安装 Hyper-VCentOS 系统下载:CentOS 国内镜像源 8.5.2111作者:易墨发布时间:2023.10.01原文地址:https://www.cnblogs.com/morang/p/devops-hyperv-centos-install.html使用命令安装 以管理员身份运行 PowerShell 命令: Enable-…

【机器学习】机器学习的基本知识点(包括背景、定义、具体内容、功能、使用场景、操作、未来发展和常见算法)

引言 机器学习是一门涉及多个领域的交叉学科&#xff0c;它主要研究如何让计算机模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;从而改善系统性能。它是人工智能的核心部分&#xff0c;并且与概率论、统计学、逼近论、凸分析、算法复杂度理论等多个学科…

c++初阶知识——string类详解

目录 前言&#xff1a; 1.标准库中的string类 1.1 auto和范围for auto 范围for 1.2 string类常用接口说明 1.string类对象的常见构造 1.3 string类对象的访问及遍历操作 1.4. string类对象的修改操作 1.5 string类非成员函数 2.string类的模拟实现 2.1 经典的string…

TSMC常见工艺库中7t/9t track的选择

在TSMC的工艺库中&#xff0c;"7T" 和 "9T" 是指标准单元库的轨道&#xff08;track&#xff09;数。轨道数&#xff08;track count&#xff09;通常是指每个单元的高度&#xff0c;这个高度决定了布线资源的密度和灵活性。 例如tcbn22ullbwp7t30p140_11…