news 2026/4/24 17:11:20

雪花算法(Snowflake)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
雪花算法(Snowflake)

雪花算法(Snowflake) 是 Twitter 开源的分布式唯一 ID 生成算法。它的核心思想是将一个64位(bit)长整型(Long)数字,按位划分为几个不同的部分,分别用来存储时间戳、机器标识和序列号等信息,从而保证在分布式环境下生成的ID全局唯一。

  • 第1位:符号位 (1 bit)
    值固定为0。因为生成的ID需要为正整数,而在计算机的二进制表示中,最高位(符号位)为1代表负数。
    该位不使用,因此可用的数值位是后面的63位。

  • 第2-42位:时间戳 (41 bits)
    这部分存储的是 “当前时间戳 - 自定义起始时间戳” 的差值。
    自定义起始时间戳可以根据你的系统上线时间设置,这能延长ID生成算法的可用时间。
    由于是41位,最多可表示 2^41 - 1 个毫秒数,换算成年份大约是 69年,对于绝大多数系统而言已足够。
    这部分确保了生成的ID整体上是 趋势递增 的。

  • 第43-52位:工作机器ID (10 bits)
    这10位用于标识生成ID的机器或节点,确保不同机器上生成的ID不会冲突。
    总共可部署 2^10 = 1024 个节点。在标准实现中,常将这10位进一步拆分为:
    5位数据中心ID (datacenterId):最多标识 32 个数据中心。
    5位机器ID (workerId):最多标识每个数据中心的 32 台机器。
    你也可以根据实际业务需要灵活调整划分比例,例如不需要数据中心时,可将全部10位用作机器ID。

  • 第53-64位:序列号 (12 bits)
    这是 一毫秒内 的计数器,用于处理单个机器在同一毫秒内的并发请求。
    12位最多可表示 2^12 = 4096 个序列号(从0到4095)。
    这意味着,在单个节点上,每毫秒最多可生成4096个全局唯一ID。理论峰值性能相当高,可达每秒约409.6万个ID(1000ms * 4096)。

特点:

纯本地生成,不依赖数据库
全局唯一,不重复
趋势递增(适合数据库索引)
高性能、高并发
64 位长整型(Long)

JavaAPI示例:

packagecom.mantou.part1.bean;/** * @author rehumantou * @date 2026-04-17 15:58 * @description 手搓雪花算法工具类 */publicclassSnowflakeIdGenerator{// ============================== 常量配置 =================================/** 起始时间戳:2020-01-01 00:00:00(可自定义) */privatestaticfinallongEPOCH=1577836800000L;/** 机器ID所占位数 */privatestaticfinallongWORKER_ID_BITS=5L;/** 数据中心ID所占位数 */privatestaticfinallongDATACENTER_ID_BITS=5L;/** 序列号所占位数 */privatestaticfinallongSEQUENCE_BITS=12L;/** 机器ID最大值 31 */privatestaticfinallongMAX_WORKER_ID=~(-1L<<WORKER_ID_BITS);/** 数据中心ID最大值 31 */privatestaticfinallongMAX_DATACENTER_ID=~(-1L<<DATACENTER_ID_BITS);/** 机器ID左移位数 12 */privatestaticfinallongWORKER_ID_SHIFT=SEQUENCE_BITS;/** 数据中心ID左移位数 12+5=17 */privatestaticfinallongDATACENTER_ID_SHIFT=SEQUENCE_BITS+WORKER_ID_BITS;/** 时间戳左移位数 12+5+5=22 */privatestaticfinallongTIMESTAMP_SHIFT=SEQUENCE_BITS+WORKER_ID_BITS+DATACENTER_ID_BITS;/** 序列号掩码 4095 */privatestaticfinallongSEQUENCE_MASK=~(-1L<<SEQUENCE_BITS);// ============================== 成员变量 =================================/** 数据中心ID */privatefinallongdatacenterId;/** 机器ID */privatefinallongworkerId;/** 序列号 */privatelongsequence=0L;/** 上一次时间戳 */privatelonglastTimestamp=-1L;// ============================== 构造方法 =================================publicSnowflakeIdGenerator(longworkerId,longdatacenterId){if(workerId>MAX_WORKER_ID||workerId<0){thrownewIllegalArgumentException("机器ID超出范围 0~31");}if(datacenterId>MAX_DATACENTER_ID||datacenterId<0){thrownewIllegalArgumentException("数据中心ID超出范围 0~31");}this.workerId=workerId;this.datacenterId=datacenterId;}// ============================== 核心方法 =================================publicsynchronizedlongnextId(){longnow=System.currentTimeMillis();// 时间回拨(异常情况)if(now<lastTimestamp){thrownewRuntimeException("时间回拨,无法生成ID");}// 同一毫秒内,序列号自增if(now==lastTimestamp){sequence=(sequence+1)&SEQUENCE_MASK;// 序列号用尽,等待下一毫秒if(sequence==0){now=waitNextMillis(lastTimestamp);}}else{// 新毫秒,重置序列号sequence=0L;}lastTimestamp=now;// 拼接IDreturn((now-EPOCH)<<TIMESTAMP_SHIFT)|(datacenterId<<DATACENTER_ID_SHIFT)|(workerId<<WORKER_ID_SHIFT)|sequence;}/** * 等待下一毫秒 */privatelongwaitNextMillis(longlastTimestamp){longnow=System.currentTimeMillis();while(now<=lastTimestamp){now=System.currentTimeMillis();}returnnow;}publicstaticvoidmain(String[]args){// 创建实例:机器ID=1,数据中心ID=1SnowflakeIdGeneratorgenerator=newSnowflakeIdGenerator(1,1);// 生成10个IDfor(inti=0;i<10;i++){longid=generator.nextId();System.out.println("生成ID:"+id);}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 18:35:27

ABAP ALV交互进阶:详解双击事件与动态跳转逻辑

1. 理解ALV双击事件的核心逻辑 ALV报表作为SAP系统中最常用的数据展示工具&#xff0c;其交互能力直接影响用户体验。双击事件&#xff08;Double Click&#xff09;是最自然的交互方式之一&#xff0c;用户会本能地希望通过点击获取更多信息。在ABAP开发中&#xff0c;实现这一…

作者头像 李华
网站建设 2026/4/18 18:29:20

防泄密软件都有谁?2026精选六款专业性强的防泄密软件

2025年&#xff0c;一家跨国半导体企业因员工将未加密的设计图纸拷贝至个人U盘&#xff0c;并在家中联网电脑上打开&#xff0c;导致核心IP被窃取。攻击者通过钓鱼邮件获取访问权限后&#xff0c;直接下载了明文文件。该事件造成新产品延期发布&#xff0c;损失预估超过2亿美元…

作者头像 李华
网站建设 2026/4/24 1:22:30

用GEE和Sentinel-5P数据,5分钟搞定城市空气质量变化趋势图(以NO2为例)

5分钟掌握城市NO2污染动态&#xff1a;基于GEE与Sentinel-5P的快速可视化实战 当我们需要评估城市空气质量变化时&#xff0c;传统的地面监测站数据往往存在空间覆盖不足的问题。而欧洲航天局Sentinel-5P卫星搭载的TROPOMI传感器&#xff0c;能以73.5km的高分辨率每日扫描全球…

作者头像 李华
网站建设 2026/4/24 5:16:28

2025届最火的五大降AI率工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低人工智能生成文本的辨识度&#xff0c;得从多个维度着手干预。其一&#xff0c;别用过…

作者头像 李华
网站建设 2026/4/18 18:16:09

fre:ac音频转换器:免费跨平台的终极音频转换指南

fre:ac音频转换器&#xff1a;免费跨平台的终极音频转换指南 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac fre:ac是一款功能强大的免费开源音频转换工具&#xff0c;支持Windows、macOS、Linux和Free…

作者头像 李华