1. 引言

随机十六进制值在应用中常作为唯一标识符,用于数据库记录、会话令牌或游戏机制等场景。它们还能增强加密安全性和测试流程。本文将介绍在Java中生成随机十六进制值的几种实用方法。

2. 使用 java.util.Random

java.util.Random 类提供了生成随机整数和长整数的简单方式,我们可以将其转换为十六进制值。

2.1 生成无界十六进制值

生成随机整数后,使用 toHexString() 方法转换为十六进制字符串:

String generateUnboundedRandomHexUsingRandomNextInt() {
    Random random = new Random();
    int randomInt = random.nextInt();
    return Integer.toHexString(randomInt);
}

需要更大范围的十六进制值时,可使用 nextLong() 生成随机长整数:

String generateUnboundedRandomHexUsingRandomNextLong() {
    Random random = new Random();
    long randomLong = random.nextLong();
    return Long.toHexString(randomLong);
}

也可以用 String.format() 方法进行格式化转换:

String generateRandomHexWithStringFormatter() {
    Random random = new Random();
    int randomInt = random.nextInt();
    return String.format("%02x", randomInt);
}

2.2 生成有界十六进制值

通过 nextInt(int bound) 生成指定范围内的随机整数:

String generateRandomHexUsingRandomNextIntWithInRange(int lower, int upper) {
    Random random = new Random();
    int randomInt = random.nextInt(upper - lower) + lower;
    return Integer.toHexString(randomInt);
}

3. 使用 java.security.SecureRandom

⚠️ 对于需要加密安全的场景,必须使用 SecureRandom。它继承自 java.util.Random,同样支持有界和无界整数生成。

3.1 生成无界安全十六进制值

使用 nextInt() 生成随机整数并转换:

String generateRandomHexUsingSecureRandomNextInt() {
    SecureRandom secureRandom = new SecureRandom();
    int randomInt = secureRandom.nextInt();
    return Integer.toHexString(randomInt);
}

生成随机长整数并转换:

String generateRandomHexUsingSecureRandomNextLong() {
    SecureRandom secureRandom = new SecureRandom();
    long randomLong = secureRandom.nextLong();
    return Long.toHexString(randomLong);
}

3.2 生成有界安全十六进制值

在指定范围内生成随机整数:

String generateRandomHexUsingSecureRandomNextIntWithInRange(int lower, int upper) {
    SecureRandom secureRandom = new SecureRandom();
    int randomInt = secureRandom.nextInt(upper - lower) + lower;
    return Integer.toHexString(randomInt);
}

4. 使用 Apache commons-math3

Apache commons-math3 提供了功能更强大的 RandomDataGenerator 工具类。首先添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

最新版本可查看 Maven 仓库

4.1 生成有界随机十六进制值

使用 nextInt() 方法生成指定范围内的随机整数:

String generateRandomHexWithCommonsMathRandomDataGeneratorNextIntWithRange(int lower, int upper) {
    RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
    int randomInt = randomDataGenerator.nextInt(lower, upper);
    return Integer.toHexString(randomInt);
}

4.2 生成安全有界随机十六进制值

使用 nextSecureInt() 生成加密安全的随机整数:

String generateRandomHexWithCommonsMathRandomDataGeneratorSecureNextIntWithRange(int lower, int upper) {
    RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
    int randomInt = randomDataGenerator.nextSecureInt(lower, upper);
    return Integer.toHexString(randomInt);
}

4.3 生成指定长度的随机十六进制字符串

直接生成指定长度的十六进制字符串,简单粗暴:

String generateRandomHexWithCommonsMathRandomDataGenerator(int len) {
    RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
    return randomDataGenerator.nextHexString(len);
}

使用 nextHexString() 比手动转换更高效,直接生成目标长度的十六进制字符串。

4.4 生成指定长度的安全随机十六进制字符串

安全敏感场景下使用 nextSecureHexString()

String generateSecureRandomHexWithCommonsMathRandomDataGenerator(int len) {
    RandomDataGenerator randomDataGenerator = new RandomDataGenerator();
    return randomDataGenerator.nextSecureHexString(len);
}

此方法使用加密安全的随机数生成器,适用于令牌、密钥等高安全需求场景。

5. 总结

本文介绍了四种生成随机十六进制值的核心方法:

  • java.util.Random:基础场景够用,但不安全
  • ⚠️ java.security.SecureRandom:加密安全场景必备
  • ✅ Apache commons-math3:功能丰富,支持直接生成指定长度的十六进制字符串

根据实际需求选择合适方案,避免在安全场景踩坑。完整代码示例可在 GitHub 获取。


原始标题:Generate a Random Hexadecimal Value in Java | Baeldung