diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/IdUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/IdUtil.java index 2971216eb..dd3da0cf0 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/IdUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/IdUtil.java @@ -260,7 +260,7 @@ public class IdUtil { * @since 5.7.18 */ public static long getSnowflakeNextId() { - return getSnowflake().nextId(); + return getSnowflake().next(); } /** @@ -271,7 +271,7 @@ public class IdUtil { * @since 5.7.18 */ public static String getSnowflakeNextIdStr() { - return getSnowflake().nextIdStr(); + return getSnowflake().nextStr(); } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SeataSnowflake.java b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SeataSnowflake.java new file mode 100644 index 000000000..8cc2642cb --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SeataSnowflake.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2023. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.data.id; + +import org.dromara.hutool.core.lang.generator.Generator; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.core.util.RandomUtil; + +import java.io.Serializable; +import java.util.Date; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Seata改进的雪花算法ID
+ * 改进主要是更换了节点和时间戳的位置,以实现在单节点中单调递增 + * 来自:https://github.com/seata/seata/blob/2.x/common/src/main/java/io/seata/common/util/IdWorker.java + * 相关说明见: + * + * + *
+ * 符号位(1bit) - 节点标志ID(10bit)- 时间戳相对值(41bit) - 递增序号(12bit)
+ * (0) - (0000000000) - (0000000000 0000000000 0000000000 0000000000 0) - (000000000000)
+ * 
+ * + * @author funkye,selfishlover + */ +public class SeataSnowflake implements Generator, Serializable { + private static final long serialVersionUID = 1L; + + /** + * 默认的起始时间,为2020-05-03 + */ + public static long DEFAULT_TWEPOCH = 1588435200000L; + + // 节点ID长度 + private static final int NODE_ID_BITS = 10; + // 节点ID的最大值,1023 + private final int MAX_NODE_ID = ~(-1 << NODE_ID_BITS); + // 时间戳长度 + private static final int TIMESTAMP_BITS = 41; + // 序列号12位(表示只允许序号的范围为:0-4095) + private static final int SEQUENCE_BITS = 12; + // 时间戳+序号的最大值 + private static final long timestampAndSequenceMask = ~(-1L << (TIMESTAMP_BITS + SEQUENCE_BITS)); + + private long nodeId; + private final AtomicLong timestampAndSequence; + + /** + * 构造 + */ + public SeataSnowflake(){ + this(null); + } + + /** + * 构造 + * + * @param nodeId 节点ID + */ + public SeataSnowflake(final Long nodeId){ + this(null, nodeId); + } + + /** + * 构造 + * + * @param epochDate 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用 + * @param nodeId 节点ID + */ + public SeataSnowflake(final Date epochDate, final Long nodeId) { + final long twepoch = (null == epochDate) ? DEFAULT_TWEPOCH : epochDate.getTime(); + final long timestampWithSequence = (System.currentTimeMillis() - twepoch) << SEQUENCE_BITS; + this.timestampAndSequence = new AtomicLong(timestampWithSequence); + + initNodeId(nodeId); + } + + /** + * 获取下一个雪花ID + * + * @return id + */ + @Override + public Long next() { + final long next = timestampAndSequence.incrementAndGet(); + final long timestampWithSequence = next & timestampAndSequenceMask; + return nodeId | timestampWithSequence; + } + + /** + * 下一个ID(字符串形式) + * + * @return ID 字符串形式 + */ + public String nextStr() { + return Long.toString(next()); + } + + /** + * 初始化节点ID + * + * @param nodeId 节点ID + */ + private void initNodeId(Long nodeId) { + if (nodeId == null) { + nodeId = generateNodeId(); + } + if (nodeId > MAX_NODE_ID || nodeId < 0) { + final String message = StrUtil.format("worker Id can't be greater than {} or less than 0", MAX_NODE_ID); + throw new IllegalArgumentException(message); + } + this.nodeId = nodeId << (TIMESTAMP_BITS + SEQUENCE_BITS); + } + + /** + * 基于网卡MAC地址生成节点ID,失败则使用随机数 + * + * @return workerId + */ + private long generateNodeId() { + try { + return IdUtil.getDataCenterId(MAX_NODE_ID); + } catch (final Exception e) { + return RandomUtil.randomLong(MAX_NODE_ID + 1); + } + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/Snowflake.java b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/Snowflake.java index 7ab196978..23e85d38d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/Snowflake.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/Snowflake.java @@ -14,6 +14,7 @@ package org.dromara.hutool.core.data.id; import org.dromara.hutool.core.date.SystemClock; import org.dromara.hutool.core.lang.Assert; +import org.dromara.hutool.core.lang.generator.Generator; import org.dromara.hutool.core.lang.tuple.Pair; import org.dromara.hutool.core.util.RandomUtil; @@ -29,7 +30,7 @@ import java.util.Date; * *
  * 符号位(1bit)- 时间戳相对值(41bit)- 数据中心标志(5bit)- 机器标志(5bit)- 递增序号(12bit)
- * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * (0) - (0000000000 0000000000 0000000000 0000000000 0) - (00000) - (00000) - (000000000000)
  * 
*

* 第一位为未使用(符号位表示正数),接下来的41位为毫秒级时间(41位的长度可以使用69年)
@@ -44,23 +45,20 @@ import java.util.Date; * @author Looly * @since 3.0.1 */ -public class Snowflake implements Serializable { +public class Snowflake implements Generator, Serializable { private static final long serialVersionUID = 1L; - /** * 默认的起始时间,为Thu, 04 Nov 2010 01:42:54 GMT */ public static long DEFAULT_TWEPOCH = 1288834974657L; private static final long WORKER_ID_BITS = 5L; // 最大支持机器节点数0~31,一共32个 - @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"}) - private static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); + private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); private static final long DATA_CENTER_ID_BITS = 5L; // 最大支持数据中心节点数0~31,一共32个 - @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"}) - private static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS); - // 序列号12位(表示只允许workId的范围为:0-4095) + private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS); + // 序列号12位(表示只允许序号的范围为:0-4095) private static final long SEQUENCE_BITS = 12L; // 机器节点左移12位 private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; @@ -193,7 +191,8 @@ public class Snowflake implements Serializable { * * @return ID */ - public synchronized long nextId() { + @Override + public synchronized Long next() { long timestamp = genTime(); if (timestamp < this.lastTimestamp) { timestamp = lastTimestamp; @@ -209,12 +208,8 @@ public class Snowflake implements Serializable { } this.sequence = sequence; } else { - // issue#I51EJY - if (randomSequenceLimit > 1) { - sequence = RandomUtil.randomLong(randomSequenceLimit); - } else { - sequence = 0L; - } + // issue#I51EJY,通过随机数避免低频生成ID序号始终为0的问题 + sequence = randomSequenceLimit > 1 ? RandomUtil.randomLong(randomSequenceLimit) : 0L; } lastTimestamp = timestamp; @@ -230,8 +225,8 @@ public class Snowflake implements Serializable { * * @return ID 字符串形式 */ - public String nextIdStr() { - return Long.toString(nextId()); + public String nextStr() { + return Long.toString(next()); } /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SnowflakeGenerator.java b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SnowflakeGenerator.java deleted file mode 100644 index 1d090af2a..000000000 --- a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/SnowflakeGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023. looly(loolly@aliyun.com) - * Hutool is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * https://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ - -package org.dromara.hutool.core.data.id; - -import org.dromara.hutool.core.lang.generator.Generator; - -/** - * Snowflake生成器
- * 注意,默认此生成器必须单例使用,否则会有重复
- * 默认构造的终端ID和数据中心ID都为0,不适用于分布式环境。 - * - * @author looly - * @since 5.4.3 - */ -public class SnowflakeGenerator implements Generator { - - private final Snowflake snowflake; - - /** - * 构造 - */ - public SnowflakeGenerator() { - this(0, 0); - } - - /** - * 构造 - * - * @param workerId 终端ID - * @param dataCenterId 数据中心ID - */ - public SnowflakeGenerator(final long workerId, final long dataCenterId) { - snowflake = new Snowflake(workerId, dataCenterId); - } - - @Override - public Long next() { - return this.snowflake.nextId(); - } -} diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/SimpleCacheTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/cache/SimpleCacheTest.java similarity index 96% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/SimpleCacheTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/cache/SimpleCacheTest.java index 2569a2655..ed87c70c7 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/SimpleCacheTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/cache/SimpleCacheTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.cache; import org.dromara.hutool.core.cache.SimpleCache; import org.dromara.hutool.core.thread.ConcurrencyTester; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/NanoIdTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/NanoIdTest.java similarity index 98% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/NanoIdTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/data/id/NanoIdTest.java index f59c4d6cc..0add047a9 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/NanoIdTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/NanoIdTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.data.id; import org.dromara.hutool.core.data.id.NanoId; import org.junit.jupiter.api.Assertions; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/ObjectIdTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/ObjectIdTest.java similarity index 89% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/ObjectIdTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/data/id/ObjectIdTest.java index 9db03ea1c..7083e4fcd 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/ObjectIdTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/ObjectIdTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,9 +10,10 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.data.id; import org.dromara.hutool.core.data.id.ObjectId; +import org.dromara.hutool.core.lang.Console; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/SnowflakeTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/SnowflakeTest.java similarity index 89% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/SnowflakeTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/data/id/SnowflakeTest.java index 1fb284f2e..80e2da7fd 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/SnowflakeTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/SnowflakeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,12 +10,13 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.data.id; import org.dromara.hutool.core.collection.ConcurrentHashSet; import org.dromara.hutool.core.data.id.IdUtil; import org.dromara.hutool.core.data.id.Snowflake; import org.dromara.hutool.core.exception.HutoolException; +import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.lang.tuple.Pair; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.thread.ThreadUtil; @@ -38,7 +39,7 @@ public class SnowflakeTest { public void snowflakeTest1(){ //构建Snowflake,提供终端ID和数据中心ID final Snowflake idWorker = new Snowflake(0, 0); - final long nextId = idWorker.nextId(); + final long nextId = idWorker.next(); Assertions.assertTrue(nextId > 0); } @@ -49,7 +50,7 @@ public class SnowflakeTest { //构建Snowflake,提供终端ID和数据中心ID final Snowflake idWorker = new Snowflake(0, 0); for (int i = 0; i < 1000; i++) { - final long id = idWorker.nextId(); + final long id = idWorker.next(); hashSet.add(id); } Assertions.assertEquals(1000L, hashSet.size()); @@ -59,7 +60,7 @@ public class SnowflakeTest { public void snowflakeGetTest(){ //构建Snowflake,提供终端ID和数据中心ID final Snowflake idWorker = new Snowflake(1, 2); - final long nextId = idWorker.nextId(); + final long nextId = idWorker.next(); Assertions.assertEquals(1, idWorker.getWorkerId(nextId)); Assertions.assertEquals(2, idWorker.getDataCenterId(nextId)); @@ -75,7 +76,7 @@ public class SnowflakeTest { final Set ids = new ConcurrentHashSet<>(); ThreadUtil.concurrencyTest(100, () -> { for (int i = 0; i < 50000; i++) { - if(!ids.add(snowflake.nextId())){ + if(!ids.add(snowflake.next())){ throw new HutoolException("重复ID!"); } } @@ -85,7 +86,7 @@ public class SnowflakeTest { @Test public void getSnowflakeLengthTest(){ for (int i = 0; i < 1000; i++) { - final long l = IdUtil.getSnowflake(0, 0).nextId(); + final long l = IdUtil.getSnowflake(0, 0).next(); Assertions.assertEquals(19, StrUtil.toString(l).length()); } } @@ -96,7 +97,7 @@ public class SnowflakeTest { final Snowflake snowflake = new Snowflake(null, 0, 0, false, 2); for (int i = 0; i < 1000; i++) { - final long id = snowflake.nextId(); + final long id = snowflake.next(); Console.log(id); ThreadUtil.sleep(10); } @@ -112,7 +113,7 @@ public class SnowflakeTest { final Set ids = new ConcurrentHashSet<>(); ThreadUtil.concurrencyTest(100, () -> { for (int i = 0; i < 50000; i++) { - if(!ids.add(snowflake.nextId())){ + if(!ids.add(snowflake.next())){ throw new HutoolException("重复ID!"); } } @@ -127,7 +128,7 @@ public class SnowflakeTest { final long workerId = RandomUtil.randomLong(31); final long dataCenterId = RandomUtil.randomLong(31); final Snowflake idWorker = new Snowflake(workerId, dataCenterId); - final long generatedId = idWorker.nextId(); + final long generatedId = idWorker.next(); // 随机忽略数据中心和工作机器的占位 final boolean ignore = RandomUtil.randomBoolean(); final long createTimestamp = idWorker.getGenerateDateTime(generatedId); diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/UUIDTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/UUIDTest.java similarity index 92% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/UUIDTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/data/id/UUIDTest.java index 087eb67ca..d46d14e01 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/UUIDTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/data/id/UUIDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.data.id; import org.dromara.hutool.core.collection.ConcurrentHashSet; import org.dromara.hutool.core.data.id.UUID; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/TupleTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/lang/tuple/TupleTest.java similarity index 91% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/TupleTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/lang/tuple/TupleTest.java index 954fcd5e5..44aa2fbcf 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/TupleTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/lang/tuple/TupleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.lang.tuple; import org.dromara.hutool.core.lang.tuple.Tuple; import org.junit.jupiter.api.Assertions; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/DictTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/map/DictTest.java similarity index 96% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/DictTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/map/DictTest.java index b24629699..ab6ef8155 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/DictTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/map/DictTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.map; import org.dromara.hutool.core.lang.builder.GenericBuilder; import org.dromara.hutool.core.date.DateTime; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/lang/StrFormatterTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrFormatterTest.java similarity index 96% rename from hutool-core/src/test/java/org/dromara/hutool/core/lang/StrFormatterTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/text/StrFormatterTest.java index 730d12b7d..1fa97ce02 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/lang/StrFormatterTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrFormatterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 looly(loolly@aliyun.com) + * Copyright (c) 2023. looly(loolly@aliyun.com) * Hutool is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.lang; +package org.dromara.hutool.core.text; import org.dromara.hutool.core.text.placeholder.StrFormatter; import org.junit.jupiter.api.Assertions; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/IdUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/IdUtilTest.java index 22309c935..4cb0a618c 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/IdUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/IdUtilTest.java @@ -86,7 +86,7 @@ public class IdUtilTest { @Test public void getSnowflakeTest() { final Snowflake snowflake = IdUtil.getSnowflake(1, 1); - final long id = snowflake.nextId(); + final long id = snowflake.next(); Assertions.assertTrue(id > 0); } @@ -104,7 +104,7 @@ public class IdUtilTest { for(int i =0; i < threadCount; i++) { ThreadUtil.execute(() -> { for(int i1 = 0; i1 < idCountPerThread; i1++) { - final long id = snowflake.nextId(); + final long id = snowflake.next(); set.add(id); // Console.log("Add new id: {}", id); } @@ -134,7 +134,7 @@ public class IdUtilTest { for(int i =0; i < threadCount; i++) { ThreadUtil.execute(() -> { for(int i1 = 0; i1 < idCountPerThread; i1++) { - final long id = IdUtil.getSnowflake(1, 1).nextId(); + final long id = IdUtil.getSnowflake(1, 1).next(); set.add(id); // Console.log("Add new id: {}", id); }