您好,登錄后才能下訂單哦!
小編給大家分享一下雪花算法生成id的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
雪花算法生成id的方法:首先新建一個id生成的類;然后新建一個調用生成id的單例工具;最后使用函數【GuuidUtil.getUUID()】直接調用即可。
雪花算法生成id的方法:
1、新建一個id生成的類 SnowFlake
/** * @Auther: lyl * @Date: 2019/11/21 17:49 * @Description: */ 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;//上一次時間戳 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; } /** * 產生下一個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 { //不同毫秒內,序列號置為0 sequence = 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) { SnowFlake snowFlake = new SnowFlake(2, 3); for (int i = 0; i < (1 << 12); i++) { System.out.println(snowFlake.nextId()); } } }
2、為防止多線程生成重復的id,這邊新建了一個調用生成id的單例工具
其中machineId和datacenterId可以放在配置文件中
import java.util.concurrent.CountDownLatch; /** * @Auther: lyl * @Date: 2019/11/21 18:15 * @Description: */ public class GuuidUtil { private static long machineId = 0; private static long datacenterId = 0; /** * 單例模式創建學法算法對象 * */ private enum SnowFlakeSingleton{ Singleton; private SnowFlake snowFlake; SnowFlakeSingleton(){ snowFlake = new SnowFlake(datacenterId,machineId); } public SnowFlake getInstance(){ return snowFlake; } } public static long getUUID(){ return SnowFlakeSingleton.Singleton.getInstance().nextId(); } public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(10000); long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { new Runnable() { @Override public void run() { System.out.println(GuuidUtil.getUUID()); latch.countDown(); } }.run(); } try { System.out.println("主線程"+Thread.currentThread().getName()+"等待子線程執行完成..."); latch.await();//阻塞當前線程,直到計數器的值為0 System.out.println("主線程"+Thread.currentThread().getName()+"開始執行..."); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print("雪花算法用時: "); System.out.println(System.currentTimeMillis() - start); } }
最后直接調用:GuuidUtil.getUUID()
;就可以直接生成id
以上是雪花算法生成id的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。