雪花算法(snowflake)原理和实现

本文深入解析Twitter的SnowFlake分布式ID生成算法,详细介绍其结构与工作原理,包括时间戳、机器ID和序列号等关键部分,并提供完整的Java实现代码。

1.简介

分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。

2.生成序列的结构图

在这里插入图片描述

1. 第一个部分: 1 个 bit:0,这个是无意义的。
2. 第二个部分: 41个 bit:是时间戳,即为当前的毫秒数。
3. 第三个部分: 10个 bit:机器的id。
4. 第四个部分:12 个 bit:序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,一台机器一毫秒内生成序列号最大值为2的12次方(4096),超过此个数延迟到下一秒生成。

3.twitter的snowflake算法 – java实现


/**
 * twitter的snowflake算法 -- java实现
 *
 * @author rock
 * @date 2016/11/26
 */
public class SnowFlake {
   
   

    /** 开始时间截 (2015-01-01) */
    private final long twepoch = 1420041600000L;

    /** 机器id所占的位数 */
    private final long workerIdBits = 5L;

    /** 数据标识id所占的位数 */
    private final long datacenterIdBits = 5L;

    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

    /** 支持的最大数据标识id,结果是31 */
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

    /** 序列在id中占的位数 */
    private final long sequenceBits = 12L;

    /** 机器ID向左移12位 */
    private final long workerIdShift = sequenceBits;

    /** 数据标识id向左移17位(12+5) */
    private final long datacenterIdShift = sequenceBits + workerIdBits;

    /** 时间截向左移22位(5+5+12) */
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
    private final 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像夏天一样热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值