雪花算法 百度百科,雪花算法生成16位
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
【相关学习推荐:java基础】
雪花算法生成id的方法:
1、新建一个编号生成的类雪花
/**
* @Auther: lyl
* @日期:2019/11/21 17:49
* @描述:
*/
公共类雪花{
/**
* 起始的时间戳
*/
私终静态长启动_ STMP=1480166465631 l;
/**
* 每一部分占用的位数
*/
私有最终静态长序列_ BIT=12//序列号占用的位数
私有最终静态长机器位=5;//机器标识占用的位数
私人决赛静态long data center _ BIT=5;//数据中心占用的位数
/**
* 每一部分的最大值
*/
私有最终静态长max _ data center _ num=-1l ^(-1l数据中心_ bit);
私有最终静态long max _ machine _ num=-1l ^(-1l机器_ bit);
私有最终静态长max _ sequence=-1l ^(-1l序列_比特);
/**
* 每一部分向左的位移
*/
私有最终静态长机器_左=序列_位
私有最终静态长数据center _ LEFT=SEQUENCE _ BIT MACHINE _ BIT;
私有最终静态长时间tmp _ LEFT=data center _ LEFT data center _ BIT;
私有长数据中心Id//数据中心
私有long machineId//机器标识
私有长序列=0L//序列号
private long last stmp=-1L;//上一次时间戳
公共雪花(长数据中心Id,长机器Id) {
如果(数据中心Id MAX_DATACENTER_NUM 数据中心Id 0) {
抛出新的IllegalArgumentException(数据中心id不能大于最大数据中心数量或小于0 );
}
如果(机器Id MAX_MACHINE_NUM 机器Id 0) {
抛出新的IllegalArgumentException(计算机id不能大于最大机器数量或小于0 );
}
这个。数据中心id=数据中心id;
这个。机器id=机器id;
}
/**
* 产生下一个身份
*
* @返回
*/
公共同步长nextId() {
long curr stmp=getNewstmp();
if (currStmp lastStmp) {
抛出新的RuntimeException(时钟向后移动。拒绝生成id’);
}
if (currStmp==lastStmp) {
//相同毫秒内,序列号自增
序列=(序列1)MAX _ SEQUENCE;
//同一毫秒的序列数已经达到最大
if (sequence==0L) {
curr stmp=getNextMill();
}
}否则{
//不同毫秒内,序列号置为0
序列=0L
}
lastStmp=currStmp
return(currStmp-START _ STMP)乘以tmp _ LEFT//时间戳部分
datacenterId DATACENTER_LEFT //数据中心部分
machineId MACHINE_LEFT //机器标识部分
序列;//序列号部分
}
private long getNextMill() {
long mill=getNewstmp();
while (mill=lastStmp) {
mill=getNewstmp();
}
返回磨机;
}
private long getNewstmp() {
返回系统。当前时间毫秒();
}
公共静态void main(String[] args) {
雪花雪花=新雪花(2,3);
for(int I=0;I(1 12);i ) {
System.out.println(雪花。nextid());
}
}
}2、为防止多线程生成重复的id,这边新建了一个调用生成编号的单例工具
其中machineId和数据中心身份可以放在配置文件中
导入Java。util。并发。countdownlatch
/**
* @Auther: lyl
* @日期:2019/11/21 18:15
* @描述:
*/
公共类GuuidUtil
私有静态长机器id=0;
私有静态长数据中心id=0;
/**
* 单例模式创建学法算法对象
* */
私有枚举雪片Singleton{
独生子女;
私人雪花雪花;
SnowFlakeSingleton(){
雪花=新雪花(数据中心Id,机器id);
}
公共雪花getInstance(){
还雪花;
}
}
公共静态long getUUID(){
返回雪片星顿.Singleton.getInstance().nextId();
}
公共静态void main(String[] args) {
CountDownLatch latch=new CountDownLatch(10000);
长启动=系统。当前时间毫秒();
for(int I=0;我10000;i ) {
新的Runnable() {
@覆盖
公共无效运行(){
系统。出去。println(guuidutil。get uuid());
闩上。倒计时();
}
}.run();
}
尝试{
System.out.println(主线程Thread.currentThread().getName()等待子线程执行完成.);
闩上。await();//阻塞当前线程,直到计数器的值为0
System.out.println(主线程Thread.currentThread().getName()开始执行.);
} catch (InterruptedException e) {
e。printstacktrace();
}
System.out.print(雪花算法用时: );
系统。出去。println(系统。当前时间毫秒()-开始);
}
}最后直接调用:guuidutil。获取uuid();就可以直接生成编号
以上就是雪花算法如何生成编号的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。