雪花算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了雪花算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3283字,纯文字阅读大概需要5分钟。
内容图文
package com.example.test.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * twitter雪花算法 * @author wangxiaolei * @date 2020/3/31 15:10 */ @Component public class SnowFlake { private static Logger log = LoggerFactory.getLogger(SnowFlake.class); /** * 起始的时间戳 */privatefinalstaticlong START_STMP = 1480166465631L; /** * 每一部分占用的位数 */privatefinalstaticlong SEQUENCE_BIT = 12; //序列号占用的位数privatefinalstaticlong MACHINE_BIT = 5; //机器标识占用的位数privatefinalstaticlong DATACENTER_BIT = 5;//数据中心占用的位数/** * 每一部分的最大值 */privatefinalstaticlong MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); privatefinalstaticlong MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); privatefinalstaticlong MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); /** * 每一部分向左的位移 */privatefinalstaticlong MACHINE_LEFT = SEQUENCE_BIT; privatefinalstaticlong DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; privatefinalstaticlong TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; privatestaticlong datacenterId; //数据中心privatestaticlong machineId; //机器标识privatestaticlong sequence = 0L; //序列号privatestaticlong lastStmp = -1L;//上一次时间戳/*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"); } this.datacenterId = datacenterId; this.machineId = machineId; }*/ @Value("${datacenter_id:0}") publicvoid setDatacenterId(long datacenterId){ if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { thrownew IllegalArgumentException("datacenterId can‘t be greater than MAX_DATACENTER_NUM or less than 0"); } SnowFlake.datacenterId = datacenterId; log.info("datacenterId:"+datacenterId); } @Value("${machine_id:0}") publicvoid setMachineId(long machineId){ if (machineId > MAX_MACHINE_NUM || machineId < 0) { thrownew IllegalArgumentException("machineId can‘t be greater than MAX_MACHINE_NUM or less than 0"); } SnowFlake.machineId = machineId; log.info("machineId:"+machineId); } /** * 产生下一个ID * * @return*/publicstaticsynchronizedlong nextId() { long currStmp = getNewstmp(); if (currStmp < lastStmp) { thrownew 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; //序列号部分 } privatestaticlong getNextMill() { long mill = getNewstmp(); while (mill <= lastStmp) { mill = getNewstmp(); } return mill; } privatestaticlong getNewstmp() { return System.currentTimeMillis(); } publicstaticvoid main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(SnowFlake.nextId()); } } }
原文:https://www.cnblogs.com/f-society/p/12722732.html
内容总结
以上是互联网集市为您收集整理的雪花算法全部内容,希望文章能够帮你解决雪花算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。