代码实现:

public class SnowflakeManagerUtil {private static final long EPOCH_STAMP = 1262275200000L;private static final long SEQUENCE_BIT = 12L;private static final long MACHINE_BIT = 5L;private static final long DATA_CENTER_BIT = 5L;private static final long MAX_SEQUENCE_NUM = -1L ^ (-1L << SEQUENCE_BIT);private static final long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private static final long MAX_DATA_CENTER_NUM = -1L ^ (-1L << DATA_CENTER_BIT);private static final long MACHINE_LEFT = SEQUENCE_BIT;private static final long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;private static final long TIMESTAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT + DATA_CENTER_BIT;private final long machineId;private final long dataCenterId;private long sequence = 0L;private long lastTimestamp = -1L;public SnowflakeManager(long machineId, long dataCenterId) {if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException(String.format("machine id can't be greater than %d or less than 0", MAX_MACHINE_NUM));}if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {throw new IllegalArgumentException(String.format("data center id can't be greater than %d or less than 0", MAX_DATA_CENTER_NUM));}this.machineId = machineId;this.dataCenterId = dataCenterId;}public synchronized long nextValue() throws Exception {String os = System.getProperty("os.name");SecureRandom secureRandom;if (os.toLowerCase().startsWith("win")) {// windows机器用secureRandom = SecureRandom.getInstanceStrong();} else {// linux机器用secureRandom = SecureRandom.getInstance("NativePRNGNonBlocking");}//SecureRandom secureRandom = SecureRandom.getInstanceStrong();long currentTimeMillis = this.currentTimeMillis();if(currentTimeMillis < this.lastTimestamp) {throw new Exception(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", (this.lastTimestamp-currentTimeMillis)));}if(this.lastTimestamp == currentTimeMillis) {this.sequence = (this.sequence+1) & MAX_SEQUENCE_NUM;if (this.sequence == 0) {this.sequence = secureRandom.nextInt(Long.valueOf(SEQUENCE_BIT).intValue());currentTimeMillis = this.tilNextMillis(this.lastTimestamp);}} else {this.sequence = secureRandom.nextInt(Long.valueOf(SEQUENCE_BIT).intValue());}this.lastTimestamp = currentTimeMillis;// 64 Bit ID (42(Millis)+5(Data Center ID)+5(Machine ID)+12(Repeat Sequence Summation))long nextId = ((currentTimeMillis-EPOCH_STAMP) << TIMESTAMP_LEFT)| (this.dataCenterId << DATA_CENTER_LEFT)| (this.machineId << MACHINE_LEFT)| this.sequence;return nextId;}private long tilNextMillis(long lastTimestamp) {long currentTimeMillis = this.currentTimeMillis();while (currentTimeMillis <= lastTimestamp) {currentTimeMillis = this.currentTimeMillis();}return currentTimeMillis;}private long currentTimeMillis() {return System.currentTimeMillis();}}

外部调用:

//new 一个工具类
SnowflakeManagerUtil snowflakeUtil = new SnowflakeManagerUtil (28, 0);
//比如获取ID
long id = snowflakeUtil.nextValue();

windows、Linux两用Snowflake雪花算法生成ID,java工具类实现直接调用即可相关推荐

  1. 线上使用雪花算法生成id重复问题

    项目中使用的是hutool工具类库提供的雪花算法生成id方式,版本使用的是5.3.1 <dependency><groupId>cn.hutool</groupId> ...

  2. mybatis-plus雪花算法生成Id使用详解

    文章目录 前言 一.mybatis-plus官网 二.雪花算法实战 1.建表 2.新建测试工程 3.单元测试 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 六.内置的雪花算法工具 ...

  3. java 雪花算法生成ID

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  4. 雪花算法生成id重复问题

    为何重复 我们之前精通分布式,没听过SnowFlake?中提到,雪花算法在同一机器同一毫秒级,我们能生成4096个不同序列(12bit序列号情况下),即不同Id,但是如果我们使用的是微服务架构,那不同 ...

  5. 分布式系统中间件(Mogodb、ElasticSearch )雪花算法生成ID

    转载:https://www.cnblogs.com/jakeylove3/p/8446798.html 1.前言 关于如何在系统中生成唯一性ID的问题(如订单号.批次号等),一直困扰了许久.因为还要 ...

  6. 分布式ID生成方案(二):SnowFlake雪花算法

    雪花算法(SnowFlake) 是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器. SnowFlake算法生成id ...

  7. python雪花算法生成id_理解分布式id生成算法SnowFlake

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位 ...

  8. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

  9. 基于雪花算法生成用户id

    8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...

最新文章

  1. 求生之路 l4d linux,求生之路开服过程(基于ubuntu)
  2. Python 学习笔记 - 字典
  3. PHP语言 -- Ajax 查询数据
  4. input和output哪个是充电_input是什么接口?告诉大家这个小常识,以后音箱接线更容易...
  5. Turbo C 2.0、Borland C++库函数及用例
  6. Week09《java程序设计》第九次作业总结
  7. Base64加密处理
  8. 使用python来读取超大型文件数据
  9. C#中的常量、类型推断和作用域
  10. 全屋wifi测试软件,全屋WIFI评测
  11. 初见Autorun病毒与解决办法
  12. Win11、10下安装enspHCL,解决兼容问题
  13. html标签高度塌陷,CSS中如何解决高度塌陷问题
  14. java和iOS的DES/EBC/PKCS5Padding
  15. 双非渣本,5年从三流外包到阿里P6,面筋分享,给2021的移动开发一些建议
  16. 通过cluster reshard实现Redis集群缩减节点实战【详细步骤】
  17. MTK平台一个花屏重启问题的分析
  18. python3爬取巨潮资讯网站年报数据
  19. Biowulf User Guide
  20. centOS7安装 mysql-community-release-el7- 5.noarch.rpm

热门文章

  1. 开源 非开源_一个开源糖果店里的孩子
  2. 线性卷积、周期卷积和圆周卷积的区别
  3. 总结定时器设计方法_钢结构深化设计BIM应用方法总结
  4. 矮人DOS工具箱4.2安装及使用图解(ppt)
  5. 中小企业在管理中常见的几大问题
  6. 关于冒险岛封包拦截程序的开发计划
  7. squirrel 脚本_Squirrel便携式Shell和脚本语言
  8. android_ android apk analyzer(libchecker apk分析器):分析Android手机上已安装的app(库/基础组件分析/开发技术)/从酷安市场下载安装包
  9. BUUCTF 面具下的flag
  10. 克鲁斯卡尔算法(Kruskal)详解