12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package com.szwl.util;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Random;
- import java.util.concurrent.atomic.AtomicLong;
- public class IDGenerator {
- private static final AtomicLong seq = new AtomicLong(0);
- private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
- private static final SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
- /**
- * 生成唯一的16位长整型ID --> equipment等常用表
- *
- * @return 订单ID
- */
- public static synchronized long commonID() {
- String timestamp = dateFormat1.format(new Date()).substring(2);
- long threadId = Thread.currentThread().getId();
- String s1 = String.valueOf(threadId);
- char c = s1.charAt(s1.length() - 1);
- //huTool工具集的雪花算法 --> 生成19位id
- //参数1为终端ID
- //参数2为数据中心ID
- // Snowflake snowflake = IdUtil.getSnowflake(1, 1);
- // long id = snowflake.nextId();
- // System.out.println("id***" + id);
- return Long.parseLong(timestamp + c);
- }
- /**
- * 生成唯一的18位长整型ID --> 用于国内订单
- *
- * @return 订单ID
- */
- public static synchronized long orderID() {
- String timestamp = dateFormat.format(new Date()).substring(2);
- long threadId = Thread.currentThread().getId();
- String s1 = String.valueOf(threadId);
- char c = s1.charAt(s1.length() - 1);
- String randomNumber = generateRandomNumber();
- // 乐观锁部分
- long currentSeq;
- long nextSeq;
- do {
- currentSeq = seq.get();
- nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
- } while (!seq.compareAndSet(currentSeq, nextSeq));
- String s2 = String.valueOf(nextSeq);
- char c1 = s2.charAt(s2.length() - 1);
- String s = "5"; // 表示国内订单
- return Long.parseLong(s + timestamp + c + randomNumber + c1);
- }
- /**
- * 生成唯一的18位长整型ID --> 用于海外订单
- *
- * @return 订单ID
- */
- public static synchronized long coinOrderID() {
- String timestamp = dateFormat.format(new Date()).substring(2);
- long threadId = Thread.currentThread().getId();
- String s1 = String.valueOf(threadId);
- char c = s1.charAt(s1.length() - 1);
- String randomNumber = generateRandomNumber();
- // 乐观锁部分
- long currentSeq;
- long nextSeq;
- do {
- currentSeq = seq.get();
- nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
- } while (!seq.compareAndSet(currentSeq, nextSeq));
- String s2 = String.valueOf(nextSeq);
- char c1 = s2.charAt(s2.length() - 1);
- String s = "1"; // 表示海外订单
- return Long.parseLong(s + timestamp + c + randomNumber + c1);
- }
- /**
- * 生成3位伪随机数
- * 因为long类型范围是-9223372036854775808到9223372036854775807,无法容纳更大范围数字,可以将数据库字段类型改为无符号,或者使用varchar类型
- * @return 随机数
- */
- private static String generateRandomNumber() {
- Random random = new Random();
- int nextInt = random.nextInt(1000);
- // 格式化为3位数,并在不满三位的数字前面补零
- return String.format("%03d", nextInt);
- }
- }
|