IDGenerator.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package com.szwl.util;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.Random;
  5. import java.util.concurrent.atomic.AtomicLong;
  6. public class IDGenerator {
  7. private static final AtomicLong seq = new AtomicLong(0);
  8. private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
  9. private static final SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
  10. /**
  11. * 生成唯一的16位长整型ID --> equipment等常用表
  12. *
  13. * @return 订单ID
  14. */
  15. public static synchronized long commonID() {
  16. String timestamp = dateFormat1.format(new Date()).substring(2);
  17. long threadId = Thread.currentThread().getId();
  18. String s1 = String.valueOf(threadId);
  19. char c = s1.charAt(s1.length() - 1);
  20. //huTool工具集的雪花算法 --> 生成19位id
  21. //参数1为终端ID
  22. //参数2为数据中心ID
  23. // Snowflake snowflake = IdUtil.getSnowflake(1, 1);
  24. // long id = snowflake.nextId();
  25. // System.out.println("id***" + id);
  26. return Long.parseLong(timestamp + c);
  27. }
  28. /**
  29. * 生成唯一的18位长整型ID --> 用于国内订单
  30. *
  31. * @return 订单ID
  32. */
  33. public static synchronized long orderID() {
  34. String timestamp = dateFormat.format(new Date()).substring(2);
  35. long threadId = Thread.currentThread().getId();
  36. String s1 = String.valueOf(threadId);
  37. char c = s1.charAt(s1.length() - 1);
  38. String randomNumber = generateRandomNumber();
  39. // 乐观锁部分
  40. long currentSeq;
  41. long nextSeq;
  42. do {
  43. currentSeq = seq.get();
  44. nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
  45. } while (!seq.compareAndSet(currentSeq, nextSeq));
  46. String s2 = String.valueOf(nextSeq);
  47. char c1 = s2.charAt(s2.length() - 1);
  48. String s = "5"; // 表示国内订单
  49. return Long.parseLong(s + timestamp + c + randomNumber + c1);
  50. }
  51. /**
  52. * 生成唯一的18位长整型ID --> 用于海外订单
  53. *
  54. * @return 订单ID
  55. */
  56. public static synchronized long coinOrderID() {
  57. String timestamp = dateFormat.format(new Date()).substring(2);
  58. long threadId = Thread.currentThread().getId();
  59. String s1 = String.valueOf(threadId);
  60. char c = s1.charAt(s1.length() - 1);
  61. String randomNumber = generateRandomNumber();
  62. // 乐观锁部分
  63. long currentSeq;
  64. long nextSeq;
  65. do {
  66. currentSeq = seq.get();
  67. nextSeq = (currentSeq >= 999) ? 0 : currentSeq + 1;
  68. } while (!seq.compareAndSet(currentSeq, nextSeq));
  69. String s2 = String.valueOf(nextSeq);
  70. char c1 = s2.charAt(s2.length() - 1);
  71. String s = "1"; // 表示海外订单
  72. return Long.parseLong(s + timestamp + c + randomNumber + c1);
  73. }
  74. /**
  75. * 生成3位伪随机数
  76. * 因为long类型范围是-9223372036854775808到9223372036854775807,无法容纳更大范围数字,可以将数据库字段类型改为无符号,或者使用varchar类型
  77. * @return 随机数
  78. */
  79. private static String generateRandomNumber() {
  80. Random random = new Random();
  81. int nextInt = random.nextInt(1000);
  82. // 格式化为3位数,并在不满三位的数字前面补零
  83. return String.format("%03d", nextInt);
  84. }
  85. }