2019独角兽企业重金招聘Python工程师标准>>>

package twiter.snowflake;/*** twitter的snowflake算法 -- java实现*/
public class SnowFlake {/*** 起始的时间戳*/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;/*** 构造器** @param datacenterId 数据中心id (32之内,0~31)* @param machineId    机器标识id (32之内,0~31)*/public SnowFlake(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");}/*if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {datacenterId = datacenterId & (MAX_DATACENTER_NUM - 1);}if (machineId > MAX_MACHINE_NUM || machineId < 0) {machineId = machineId & (MAX_MACHINE_NUM - 1);}*/this.datacenterId = datacenterId;this.machineId = machineId;this.lastStmp = System.currentTimeMillis();}/*** 产生下一个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 {//不同毫秒内,序列号置为0sequence = 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();}public static void main(String[] args) {/***  datacenterId 数据中心id*  machineId    机器标识id*/long datacenterId = 1L;long machineId = 4L;SnowFlake snowFlake = new SnowFlake(datacenterId, machineId);for (int i = 0; i < (1 << 10); i++) {System.out.println(snowFlake.nextId());}}
}

算法思想

转载于:https://my.oschina.net/mengzhang6/blog/2963601

推特雪花算法 java实现相关推荐

  1. 推特雪花算法,分布式id生成器

    推特雪花算法 分布式id生成器 package util;import java.lang.management.ManagementFactory; import java.net.InetAddr ...

  2. 分布式ID生成解决方案——推特雪花算法

    对于某些应用,MySQL里的某个表可能会占用很大的存储空间,甚至让服务器硬盘满了,这时候就会涉及到数据库的分片,把一个数据库进行拆分,通过数据库中间件(MyCat)进行连接. 假设现在我们有三台服务器 ...

  3. 雪花算法-java实现

    雪花算法用途 用来保证分布式环境生成ID唯一. 雪花算法实现 雪花算法用64位二进制表示,其中二进制位数作用划分为: 1bit:符号位,无使用 41bit:时间位,用于表示毫秒可以使用69年 10bi ...

  4. 雪花算法-Java实现-解决时钟回拨的一种方法

    背景: 前不久发生了一次严重的生产事件, 与雪花算法有关,但不是雪花算法的问题 具体问题参考代码main中的注释, 结论如下 序列可以使用69年, 序列的长度变化是这样的, 假设以当前时间为初始化值 ...

  5. 雪花算法 Java 版

    雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0 41 bit: 时间差,我们 ...

  6. 雪花算法:分布式唯一 ID 生成利器

    无论是在分布式系统中的 ID 生成,还是在业务系统中请求流水号这一类唯一编号的生成,都是软件开发人员经常会面临的一场景.而雪花算法便是这些场景的一个解决方案. 以分布式 ID 为例,它的生成往往会在唯 ...

  7. 雪花算法(个人笔记)

    关于雪花 雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西: 雪花属于六方晶系,它具有四个结晶轴,其中三个辅轴在一个基面上,互相以60度的角度相交,第四轴(主晶轴)与三个辅轴所形 ...

  8. 雪花算法:分布式唯一ID生成利器

    前言 无论是在分布式系统中的ID生成,还是在业务系统中请求流水号这一类唯一编号的生成,都是软件开发人员经常会面临的一场景.而雪花算法便是这些场景的一个解决方案. 以分布式ID为例,它的生成往往会在唯一 ...

  9. 这可能是讲雪花算法最全的文章

    文章目录 雪花算法的起源 雪花算法原理 雪花算法java实现 一些细节讨论 调整比特位分布 workerid一般如何生成 雪花算法的起源 snowflake中文的意思是 雪花,雪片,所以翻译成雪花算法 ...

最新文章

  1. 多任务上实现SOTA,UBC、谷歌联合Hinton等提出3D点云的无监督胶囊网络
  2. 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器
  3. 97.PC 的串口是同步还是异步
  4. mysql snowflake_一篇文章彻底搞懂snowflake算法及百度美团的最佳实践
  5. java ip地址相关操作
  6. get和post有什么区别
  7. HTML基础(2)——边框
  8. mongoose-iot_如何使用带有ESP32和Mongoose OS的GCP-Cloud IoT核心版查看天气
  9. 联想i微型计算机怎么拆,联想t410i如何拆机?联想t410i拆机方法【图文】
  10. ue4设置组合键_UE4快捷键
  11. 进化算法求解TSP问题
  12. “驱动程序在 \Device\Harddisk0\D 上检测到控制器错误”的根本解决办法!
  13. 游戏因为音效而变得触动人心
  14. Pygame(三)画圆
  15. u3d 自学杂项(自用,持续更新)
  16. form-create-desniger 自定义拖拽表单
  17. 网络计算机输入网络凭据,Win10访问局域网电脑提示需要输入网络凭证怎么办?
  18. 42张动图带你走进神奇的物理世界,超震撼!
  19. http中各个状态码的含义
  20. Mission Planner初学者安装调试教程指南(APM或PIX飞控)5——规划航点航线

热门文章

  1. 保障高并发:企业必须从传统性能测试转向云压测
  2. 英特尔推深度学习加速工具包OpenVINO,布局边缘计算,发力物联网业务
  3. 深度学习框架Caffe2并入PyTorch,你的开发效率可能要提升不少
  4. 面试官:说说Spring AOP、AspectJ、CGLIB ?它们有什么关系?
  5. 还在用Logback?Log4j2的异步性能已经无敌了,还不快试试
  6. Spring Boot 整合 Quartz 实现 Java 定时任务的动态配置
  7. 面试官给我挖坑:URI中的 “//” 有什么用?
  8. 一个「菜鸟」转行AI的成长心得!
  9. 一文讲解特征工程 | 经典外文PPT及中文解析
  10. 送一款巧克力式绝美键盘!真香!