这个工具直接调用就可以了,用法和写法如下:
代码:
这个是雪花算法的写法:
1 public class SnowFlakeUtil { 2 3 /** 4 * 起始的时间戳 5 */ 6 private final static long START_STMP = 1480166465631L; 7 8 /** 9 * 每一部分占用的位数 10 */ 11 private final static long SEQUENCE_BIT = 12; //序列号占用的位数 12 private final static long MACHINE_BIT = 5; //机器标识占用的位数 13 private final static long DATACENTER_BIT = 5;//数据中心占用的位数 14 15 /** 16 * 每一部分的最大值 17 */ 18 private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); 19 private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); 20 private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); 21 22 /** 23 * 每一部分向左的位移 24 */ 25 private final static long MACHINE_LEFT = SEQUENCE_BIT; 26 private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; 27 private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; 28 29 private long datacenterId; //数据中心 30 private long machineId; //机器标识 31 private long sequence = 0L; //序列号 32 private long lastStmp = -1L;//上一次时间戳 33 34 public SnowFlakeUtil(long datacenterId, long machineId) { 35 if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { 36 throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); 37 } 38 if (machineId > MAX_MACHINE_NUM || machineId < 0) { 39 throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); 40 } 41 this.datacenterId = datacenterId; 42 this.machineId = machineId; 43 } 44 45 /** 46 * 产生下一个ID 47 * 48 * @return 49 */ 50 public synchronized long nextId() { 51 long currStmp = getNewstmp(); 52 if (currStmp < lastStmp) { 53 throw new RuntimeException("Clock moved backwards. Refusing to generate id"); 54 } 55 56 if (currStmp == lastStmp) { 57 //相同毫秒内,序列号自增 58 sequence = (sequence + 1) & MAX_SEQUENCE; 59 //同一毫秒的序列数已经达到最大 60 if (sequence == 0L) { 61 currStmp = getNextMill(); 62 } 63 } else { 64 //不同毫秒内,序列号置为0 65 sequence = 0L; 66 } 67 68 lastStmp = currStmp; 69 70 return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分 71 | datacenterId << DATACENTER_LEFT //数据中心部分 72 | machineId << MACHINE_LEFT //机器标识部分 73 | sequence; //序列号部分 74 } 75 76 private long getNextMill() { 77 long mill = getNewstmp(); 78 while (mill <= lastStmp) { 79 mill = getNewstmp(); 80 } 81 return mill; 82 } 83 84 private long getNewstmp() { 85 return System.currentTimeMillis(); 86 } 87 //小测试代码: 88 89 // public static void main(String[] args) { 90 // SnowFlakeUtil snowFlake = new SnowFlakeUtil(2, 3); 91 // 92 // System.out.println(snowFlake.nextId()); 93 // 94 // } 95 }
具体的调用:
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 import java.util.Random; 4 5 public class CreateAUniqueIDUtil { 6 public String ImageID(String subtype) { 7 SnowFlakeUtil snowFlake = new SnowFlakeUtil(2, 3);//调用雪花算法生成18位唯一id 8 long randomNumber18 = snowFlake.nextId();//18位唯一id 9 Random rand = new Random();//生成随机数 10 String cardNnumer = ""; 11 for (int a = 0; a < 2; a++) { 12 cardNnumer += rand.nextInt(10);//生成2位随机数 13 } 14 // String subtype = "01";//01代表的是对应应用中解析时的参数,当前01代表 人员 15 String randomNumberString = ""; 16 for (int a = 0; a < 5; a++) { 17 randomNumberString += rand.nextInt(10);//生成5位数字 18 } 19 Date date = new Date(); 20 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 21 String format = df.format(date); 22 String ImageID = randomNumber18 + cardNnumer + subtype + format + randomNumberString; 23 return ImageID; 24 } 25 26 public String PersonID(String subtype) { 27 SnowFlakeUtil snowFlake = new SnowFlakeUtil(2, 3);//调用雪花算法生成18位唯一id 28 long randomNumber18 = snowFlake.nextId();//18位唯一id 29 Random rand = new Random();//生成随机数 30 String cardNnumer = ""; 31 for (int i = 0; i < 23; i++) { 32 cardNnumer += rand.nextInt(10);//生成23位随机数 33 } 34 // String subtype = "01";//01-人员 35 String randomNumberString = ""; 36 for (int a = 0; a < 5; a++) { 37 randomNumberString += rand.nextInt(10);//生成5位数字 38 } 39 String PersonID = randomNumber18 + cardNnumer + subtype + randomNumberString; 40 return PersonID; 41 } 42 43 public String SourceID(String subtype) { 44 SnowFlakeUtil snowFlake = new SnowFlakeUtil(2, 3);//调用雪花算法生成18位唯一id 45 long randomNumber18 = snowFlake.nextId();//18位唯一id 46 Random rand = new Random();//生成随机数 47 String cardNnumer = ""; 48 for (int i = 0; i < 2; i++) { 49 cardNnumer += rand.nextInt(10);//生成2位随机数 50 } 51 // String subtype = "02";//01-人员02-机动车03-非机动车04-物品05-场景06-人脸等 52 Date date = new Date(); 53 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 54 String format = df.format(date); 55 String randomNumberString = ""; 56 for (int a = 0; a < 5; a++) { 57 randomNumberString += rand.nextInt(10);//生成5位数字 58 } 59 String SourceID = randomNumber18 + cardNnumer + subtype + format + randomNumberString; 60 return SourceID; 61 } 62 }