Jelajahi Sumber

优化ID生成

zhouhao 2 tahun lalu
induk
melakukan
6bed54f029

+ 1 - 6
hsweb-core/src/main/java/org/hswebframework/web/id/IDGenerator.java

@@ -18,13 +18,8 @@
 
 package org.hswebframework.web.id;
 
-import org.hswebframework.utils.RandomUtil;
 import org.hswebframework.web.utils.DigestUtils;
 
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
 /**
  * ID生成器,用于生成ID
  *
@@ -53,7 +48,7 @@ public interface IDGenerator<T> {
     /**
      * 随机字符
      */
-    IDGenerator<String> RANDOM = RandomUtil::randomChar;
+    IDGenerator<String> RANDOM = RandomIdGenerator::random;
 
     /**
      * md5(uuid())

+ 22 - 0
hsweb-core/src/main/java/org/hswebframework/web/id/RandomIdGenerator.java

@@ -0,0 +1,22 @@
+package org.hswebframework.web.id;
+
+import java.util.Base64;
+import java.util.concurrent.ThreadLocalRandom;
+
+public class RandomIdGenerator {
+
+    private final static ThreadLocal<byte[]> HOLDER = ThreadLocal.withInitial(() -> new byte[24]);
+
+
+    public static String random() {
+        return random(HOLDER.get());
+    }
+
+    public static String random(byte[] container) {
+
+        ThreadLocalRandom.current().nextBytes(container);
+
+        return Base64.getUrlEncoder().encodeToString(container);
+    }
+
+}

+ 22 - 13
hsweb-core/src/main/java/org/hswebframework/web/id/SnowflakeIdGenerator.java

@@ -5,26 +5,27 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.*;
+import java.util.concurrent.ThreadLocalRandom;
 
 @Slf4j
 public class SnowflakeIdGenerator {
 
-    private long workerId;
-    private long dataCenterId;
+    private final long workerId;
+    private final long dataCenterId;
     private long sequence = 0L;
 
-    private long twepoch = 1288834974657L;
+    private final long twepoch = 1288834974657L;
 
-    private long workerIdBits     = 5L;
-    private long datacenterIdBits = 5L;
-    private long maxWorkerId      = -1L ^ (-1L << workerIdBits);
-    private long maxDataCenterId  = -1L ^ (-1L << datacenterIdBits);
-    private long sequenceBits     = 12L;
+    private final long workerIdBits = 5L;
+    private final long datacenterIdBits = 5L;
+    private final long maxWorkerId = ~(-1L << workerIdBits);
+    private final long maxDataCenterId = ~(-1L << datacenterIdBits);
+    private final long sequenceBits = 12L;
 
-    private long workerIdShift      = sequenceBits;
-    private long datacenterIdShift  = sequenceBits + workerIdBits;
-    private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
-    private long sequenceMask       = -1L ^ (-1L << sequenceBits);
+    private final long workerIdShift = sequenceBits;
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private final long sequenceMask = ~(-1L << sequenceBits);
 
     private long lastTimestamp = -1L;
 
@@ -41,7 +42,15 @@ public class SnowflakeIdGenerator {
         return generator;
     }
 
-    public SnowflakeIdGenerator(long workerId, long dataCenterId) {
+    public static SnowflakeIdGenerator create(int workerId, int dataCenterId) {
+        return new SnowflakeIdGenerator(workerId, dataCenterId);
+    }
+
+    public static SnowflakeIdGenerator create() {
+        return create(ThreadLocalRandom.current().nextInt(31), ThreadLocalRandom.current().nextInt(31));
+    }
+
+    private SnowflakeIdGenerator(long workerId, long dataCenterId) {
         // sanity check for workerId
         if (workerId > maxWorkerId || workerId < 0) {
             throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));