SnowFlake雪花算法生成分布式id
2019-03-15 00:01
411 查看
author :Twitter
/** * 雪花算法SnowFlake * Created on 2019/3/14. * * @author Twitter */ public class IdSnowFlake { public static void main(String[] args) { IdSnowFlake flake = new IdSnowFlake(); System.out.println(flake.nextId()); } /** * 起始的时间戳 */ private final static long START_STMP = 1480166465631L; /** * 每一部分占用的位数,序列号占用的位数 */ private final static long SEQUENCE_BIT = 12; /** * 机器标识占用的位数 */ private final static long MACHINE_BIT = 5; /** * 数据中心占用的位数 */ private final static long DATACENTER_BIT = 5; /** * 每一部分的最大值 */ private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); /** * 每一部分向左的位移 */ private final static long MACHINE_LEFT = SEQUENCE_BIT; private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; /** * 数据中心 */ private long datacenterId; /** * 机器标识 */ private long machineId; /** * 序列号 */ private long sequence = 0L; /** * 上一次时间戳 */ private long lastStmp = -1L; public IdSnowFlake(long datacenterId, long machineId) { if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); } if (machineId > MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); } this.datacenterId = datacenterId; this.machineId = machineId; } public IdSnowFlake(){ } /** * 产生下一个ID * * @return */ public synchronized long nextId() { long currStmp = getNewstmp(); if (currStmp < lastStmp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (currStmp == lastStmp) { //相同毫秒内,序列号自增 sequence = (sequence + 1) & MAX_SEQUENCE; //同一毫秒的序列数已经达到最大 if (sequence == 0L) { currStmp = getNextMill(); } } else { //不同毫秒内,序列号置为0 sequence = 0L; } lastStmp = currStmp; // 时间戳部分 + 数据中心部分 + 机器标识部分 + 序列号部分 return (currStmp - START_STMP) << TIMESTMP_LEFT | datacenterId << DATACENTER_LEFT | machineId << MACHINE_LEFT | sequence; } private long getNextMill() { long mill = getNewstmp(); while (mill <= lastStmp) { mill = getNewstmp(); } return mill; } private long getNewstmp() { return System.currentTimeMillis(); } }
相关文章推荐
- Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)
- 快速理解分布式id生成算法SnowFlake
- 理解分布式id生成算法SnowFlake
- 分布式全局ID的Twitter的Snowflake(雪花算法)
- Twitter的分布式自增ID雪花算法snowflake (Java版)
- Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)
- 分布式系统应用中生成全局唯一ID的算法(snowflake)----java 实现,单例模式
- SnowFlake --- 分布式id生成算法
- SnowFlake --- 分布式id生成算法工具类
- C语言实现分布式自增有序的唯一ID生成算法-snowflake算法
- 【转】Twitter的分布式自增ID算法snowflake
- Twitter的分布式自增ID算法snowflake (Java版)
- Twitter开源分布式自增ID算法snowflake(Java)
- Twitter分布式自增ID算法Snowflake
- 【Zanuck 镇】编写php高性能snowflake算法插件(分布式64位唯一性自增id生成算法)
- 关于全局ID,雪花(snowflake)算法的说明
- Twitter的分布式自增ID算法snowflake (Java版)
- SnowFlake 分布式ID生成Java实现
- 分布式自增ID生成策略-Twitter-Snowflake实现
- Twitter的分布式自增ID算法snowflake - C#版