1. 使用 UUID 生成随机 ID
UUID (Universally Unique Identifier) 是一种广泛使用的生成唯一标识的方法,生成的 ID 具有很高的唯一性。UUID 生成的随机 ID 由 32 个字符组成,可以避免重复。
import java.util.UUID;
public class UserService {
public String generateRandomUserId() {
return UUID.randomUUID().toString().replace("-", ""); // 去掉 UUID 中的 "-"
}
}
2. 使用时间戳与随机数组合生成 ID
可以将当前时间戳与一个随机数拼接来生成一个唯一的用户 ID。这种方法可以生成较短的 ID,同时也避免重复。
import java.util.Random;
public class UserService {
public String generateRandomUserId() {
long timestamp = System.currentTimeMillis();
int randomNum = new Random().nextInt(99999);
return timestamp + String.format("%05d", randomNum); // 时间戳 + 5 位随机数
}
}
3. 使用雪花算法生成分布式唯一 ID
雪花算法(Snowflake)生成的 ID 适合分布式系统,具有递增和唯一性。可以使用一些开源的实现库,如 Hutool 中的雪花算法工具。
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
public class UserService {
private Snowflake snowflake = IdUtil.createSnowflake(1, 1);
public long generateRandomUserId() {
return snowflake.nextId();
}
}
若要使用 Hutool 中的雪花算法工具,需要添加 Hutool 的依赖。
在 pom.xml
中添加:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.20</version> <!-- 使用最新稳定版本 -->
</dependency>
在 IdUtil.createSnowflake(1, 1)
中传递的两个参数代表了 数据中心 ID 和 机器 ID,这是雪花算法生成唯一 ID 所需的参数,用来标识分布式系统中的不同节点,以确保每个节点生成的 ID 是唯一的。
参数含义
-
数据中心 ID (
datacenterId
):第一个参数(1
)代表数据中心 ID。它用于标识数据中心。值的范围通常在0-31
之间。 -
机器 ID (
workerId
):第二个参数(1
)代表机器 ID。它用于标识同一数据中心下的不同机器。值的范围也通常在0-31
之间。
雪花算法 ID 结构
雪花算法的 64 位 ID 通常由以下几个部分组成:
- 1 位符号位:始终为
0
。 - 41 位时间戳:表示时间,精确到毫秒。
- 5 位数据中心 ID:用于区分不同的数据中心,最多支持
32
个数据中心。 - 5 位机器 ID:用于区分同一数据中心下的不同机器,最多支持
32
台机器。 - 12 位序列号:用于在同一毫秒内生成多个不同的 ID,最多支持每毫秒生成
4096
个不同的 ID。
示例
如果你的系统分布在一个数据中心,且运行在单台机器上,你可以设置 IdUtil.createSnowflake(0, 0)
。如果有多个节点,确保每个节点的数据中心 ID 和机器 ID 不同,以避免 ID 冲突。
4. 将生成的 ID 设置到用户表
生成 ID 后,可以在用户插入数据时将生成的 ID 作为主键或唯一标识字段的值:
User user = new User();
user.setId(generateRandomUserId()); // 使用生成的 ID
user.setName("Example User");
userMapper.insert(user); // 插入用户数据