1. 概述

生成随机字节数组是Java开发中的常见需求,不同场景下需要选择合适的实现方式。本文将深入探讨三种主流方案:使用java.util.Randomjava.security.SecureRandom以及Apache Commons工具包(含RandomUtilsUniformRandomProvider)。通过对比分析,帮助开发者根据性能、安全性和易用性需求做出最佳选择。

2. 使用Random类

java.util.Random是生成随机字节数组最简单直接的方式,适合对性能要求高于安全性的场景(如测试数据生成):

@Test
public void givenSizeWhenGenerateUsingRandomThenOK() {
    byte[] byteArray = new byte[SIZE];
    Random random = new Random();
    random.nextBytes(byteArray);

    assertEquals(SIZE, byteArray.length);
}

⚠️ 注意:由于Random不具备加密安全性,切勿用于生成敏感数据(如密钥、令牌等)。

3. 使用SecureRandom类

当需要生成安全不可预测的随机数据时,SecureRandom是首选方案。专为加密强度设计

@Test
public void givenSizeWhenGenerateUsingSecureRandomThenOK() {
    byte[] byteArray = new byte[SIZE];
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.nextBytes(byteArray);

    assertEquals(SIZE, byteArray.length);
}

虽然性能略逊于Random,但在安全敏感场景(如密码学应用)中是不可替代的选择

4. 使用Apache Commons工具包

Apache Commons提供了更丰富的随机数生成工具,但需注意版本演进:

4.1 RandomUtils(已弃用)

通过添加commons-lang3依赖使用:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.16.0</version>
</dependency>

简化了生成流程

@Test
public void givenSizeWhenGenerateUsingRandomUtilsThenOK() {
    byte[] byteArray = RandomUtils.nextBytes(SIZE);

    assertEquals(SIZE, byteArray.length);
}

❌ 重要提示:RandomUtils已被标记为废弃,推荐升级到Apache Commons RNG

4.2 UniformRandomProvider(推荐方案)

引入commons-rng-simple依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-rng-simple</artifactId>
    <version>1.6</version>
</dependency>

性能最优解

@Test
public void givenSizeWhenGenerateUsingUniformRandomProviderThenOK() {
    byte[] byteArray = new byte[SIZE];
    UniformRandomProvider randomProvider = RandomSource.XO_RO_SHI_RO_128_PP.create();
    randomProvider.nextBytes(byteArray);

    assertEquals(SIZE, byteArray.length);
}

✅ 核心优势:

  • 性能碾压:基于现代算法(如XO_RO_SHI_RO_128_PP),速度远超其他方案
  • 算法多样:支持Mersenne Twister等多种算法
  • 统计质量高:XOR shift算法变体提供更好的随机性分布

5. 总结

方案 适用场景 安全性 性能 备注
java.util.Random 非敏感测试数据 ⭐⭐⭐ 简单但不够安全
SecureRandom 密码学/安全敏感场景 ⭐⭐ 安全首选
UniformRandomProvider 高性能通用场景 ⚠️ ⭐⭐⭐⭐ Apache Commons RNG推荐方案

踩坑指南

  • 安全场景别用Random,性能场景慎用SecureRandom
  • 新项目直接上UniformRandomProvider,别用废弃的RandomUtils

完整示例代码见GitHub仓库


原始标题:How to Generate a Random Byte Array of N Bytes | Baeldung