JAVA 雪花算法 唯一ID生成工具类

在这里插入图片描述

package com.gblfy;/*** @Author:JCccc* @Description:* @Date: created in 15:31 2019/6/12*/
public class SnowflakeIdUtils {// ==============================Fields===========================================/** 开始时间截 (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 long sequenceMask = -1L ^ (-1L << sequenceBits);/** 工作机器ID(0~31) */private long workerId;/** 数据中心ID(0~31) */private long datacenterId;/** 毫秒内序列(0~4095) */private long sequence = 0L;/** 上次生成ID的时间截 */private long lastTimestamp = -1L;//==============================Constructors=====================================/*** 构造函数* @param workerId 工作ID (0~31)* @param datacenterId 数据中心ID (0~31)*/public SnowflakeIdUtils(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}// ==============================Methods==========================================/*** 获得下一个ID (该方法是线程安全的)* @return SnowflakeId*/public synchronized long nextId() {long timestamp = timeGen();//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}//如果是同一时间生成的,则进行毫秒内序列if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;//毫秒内序列溢出if (sequence == 0) {//阻塞到下一个毫秒,获得新的时间戳timestamp = tilNextMillis(lastTimestamp);}}//时间戳改变,毫秒内序列重置else {sequence = 0L;}//上次生成ID的时间截lastTimestamp = timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) << timestampLeftShift) //| (datacenterId << datacenterIdShift) //| (workerId << workerIdShift) //| sequence;}/*** 阻塞到下一个毫秒,直到获得新的时间戳* @param lastTimestamp 上次生成ID的时间截* @return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间* @return 当前时间(毫秒)*/protected long timeGen() {return System.currentTimeMillis();}//==============================Test=============================================/** 测试 */public static void main(String[] args) {SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);System.out.println(idWorker.nextId());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为 | 泰山之巅 鲲鹏展翅 扶摇直上九万里

戳蓝字“CSDN云计算”关注我们哦&#xff01; 文 | 阿晶、王银发于上海华为HC大会现场出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;华为在计算产业究竟要怎样LU起袖子加油干&#xff1f;五岳之首、泰山之巅、初升之日、鲲鹏展翅、昇腾万里、华为计…

前端 Leader 如何做好团队规划?阿里内部培训总结公开

摘要&#xff1a; "行成于思&#xff0c;毁于随"——韩愈 在阿里从一线前端工程师到技术 TL&#xff08;Team Leader&#xff09; 也三年有余了&#xff0c;最重要最难的就是做规划&#xff0c;你可能会遇到如下几个问题&#xff1a; 业务压力巨大&#xff0c;前端是…

印象笔记编辑pdf_做笔记就用印象笔记,支持录音做笔记( 附插件下载)

印象笔记是全球闻名的效率软件和知识管理工具&#xff0c;印象笔记可以帮助我们简化工作、学习与生活。你可以在手机、电脑、平板、网页等多种设备和平台间&#xff0c;无缝同步每天的见闻、灵感与思考。一站式完成知识信息的收集备份、高效记录、分享、多端同步和永久保存。下…

php 获取域名部分,PHP 获取顶级域名 获取域名的函数 parseHost()

2012-12-19补充&#xff1a;-------------------------------------------------------------------------------------------------------------写了一个测试了一下&#xff0c;很不错&#xff01;function parseHost($httpurl){$httpurl strtolower( trim($httpurl) );if(em…

(vue基础试炼_07)Vue实例生命周期函数

文章目录一、生命周期图示二、常见的生命周期函数三、生命周期函数执行场景四、测试代码五、项目开源地址一、生命周期图示 二、常见的生命周期函数 常见的生命周期函数执行的时间beforeCreateVue初始化createdVue初始化beforeMount模板未渲染到页面上mounted模板已经渲染到页…

独家专访阿里高级技术专家北纬:Dubbo开源重启半年来的快意江湖

摘要&#xff1a; 罗毅&#xff0c;花名北纬。这个名字&#xff0c;如果是混过天涯论坛的大龄网民应该都不陌生&#xff0c;北纬67度3分周公子&#xff08;简称北纬&#xff09;虐杀易烨卿MM的世纪大战至今还是天涯神贴 &#xff0c;当时更是有看客赋诗形容&#xff1a;“目睹此…

数据库可以存php代码,php把数组保存数据库程序代码

我们在做缓存文件时经常会要把php代码或数组转换成字符串保存到数据库中&#xff0c;下面我来介绍两种把数组保存到数据库的方法。方法一&#xff1a;用serialize写入&#xff0c;再用unserialize输出serialize()就是将PHP中的变量如对象(object),数组(array)等等的值序列化为字…

实践心得:从读论文到复现到为开源贡献代码

摘要&#xff1a; 本文讲述了从在fast.ai库中读论文&#xff0c;到根据论文复制实验并做出改进&#xff0c;并将改进后的开源代码放入fast.ai库中。介绍去年我发现MOOC网上有大量的Keras和TensorKow教学视频&#xff0c;之后我从零开始学习及参加一些Kaggle比赛&#xff0c;并在…

python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行

我正在将一个元素插入到一个大的xml文件中。我希望插入的元素位于顶部(所以我需要使用根.插入方法&#xff0c;并且不能仅附加到文件中)。我也希望元素的格式与文件的其余部分相匹配。在原始XML文件的格式为....然后运行以下代码&#xff1a;^{pr2}$它以以下形式创建输出&#…

(vue基础试炼_08)Vue模板语法

文章目录一、插值表达式二、v-text 中不是字符串而是js表达式三、v-html四、js表达式&#xff0c;可以和字符串拼接五、源码链接一、插值表达式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue模…

FPGA设计中遇到的奇葩问题之“芯片也要看出身”

阿里云资深专家隐达分享了他十余年工作经历中的一段奇葩历程。文章诙谐幽默&#xff0c;用玄幻小说的写法分享技术问题&#xff0c;非常值得大家一读。 &#xff08;一&#xff09;昨夜西风凋碧树。独上高楼&#xff0c;望尽天涯路2000年的时候&#xff0c;做设计基本都是使用X…

php msgid排重,如何应用php数组对百万数据停止排重

如何应用php数组对百万数据停止排重如何应用php数组对百万数据停止排重在往常的工作中&#xff0c;常常接到要对网站的会员停止站内信、手机短信、email停止群发信息的告诉&#xff0c;用户列表普通由别的同事提供&#xff0c;当中难免会有反复&#xff0c;为了避免反复发送&am…

FPGA资源平民化的新晋- F3 技术解析

摘要&#xff1a; FPGA (现场可编程门阵列)由于其硬件并行加速能力和可编程特性&#xff0c;在传统通信领域和IC设计领域大放异彩。一路走来&#xff0c;FPGA并非一个新兴的硬件器件&#xff0c;由于其开发门槛过高&#xff0c;硬件加速算法的发布和部署保护要求非常高&#xf…

Vue计算属性、方法、侦听器

文章目录一、基础计算模板二、计算属性computed三、方法methods四、侦听器watch五、总结六、源码地址一、基础计算模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue计算属性、方法、侦听器<…

python数据分析简答题_Python数据分析与数据可视化-中国大学mooc-试题题目及答案...

Python数据分析与数据可视化-中国大学mooc-试题题目及答案更多相关问题【简答题】城轨供电系统按功能划分为几部分&#xff1f;各有什么作用&#xff1f;【多选题】影响债券价格的因素有【单选题】关于注射剂的质量要求&#xff0c;叙述错误的是 prefix\"o\" ns\&quo…

漫画:五分钟看懂车联网

戳蓝字“CSDN云计算”关注我们哦&#xff01;福利扫描添加小编微信&#xff0c;备注“姓名公司职位”&#xff0c;加入【云计算学习交流群】&#xff0c;和志同道合的朋友们共同打卡学习&#xff01;推荐阅读&#xff1a;华为 | 泰山之巅 鲲鹏展翅 扶摇直上九万里聊聊我是如何在…

对数据科学家来说最重要的算法和统计模型

摘要&#xff1a; 本文提供了工业中常用的关键算法和统计技术的概要&#xff0c;以及与这些技术相关的短缺资源。作为一个在这个行业已经好几年的数据科学家&#xff0c;在LinkedIn和QuoLa上&#xff0c;我经常接触一些学生或者想转行的人&#xff0c;帮助他们进行机器学习的职…

JAVA ulimit,java-从linux中的jvm中查找硬打开和软打开文件限制(ulimit -n和ulimit -Hn)

我有一个问题,我需要从Java / groovy程序中找出Linux中进程的硬打开和软打开文件限制.当我从终端执行ulimit时,它将为硬打开文件限制和软打开文件限制提供单独的值.$ulimit -n1024$ulimit -Hn4096但是,如果我以常规方式执行它,它将忽略软限制并始终返回硬限制值.groovy> [ba…

计算属性的setter和getter

computed的属性不仅可以写一个get方法&#xff0c;通过其他的值算出一个新值&#xff1b;同时&#xff0c;也可以设置set方法&#xff0c;通过设置一个值&#xff0c;来改变他相关联的值&#xff01;而改变了相关联的值之后&#xff0c;又会引起fullName的重新计算&#xff0c;…

python制作远程桌面控制_Python 远程桌面协议RDPY简介

RDPY 是基于 Twisted Python 实现的微软 RDP 远程桌面协议。RDPY 提供了如下 RDP 和 VNC 支持&#xff1a;RDP Man In The Middle proxy which record sessionRDP HoneypotRDP screenshoterRDP clientVNC clientVNC screenshoterRSS Player目前能够找到的关于RDPY的中文介绍确实…