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); } }