如何创建一个包含 20 个随机字节的数组?

Posted

技术标签:

【中文标题】如何创建一个包含 20 个随机字节的数组?【英文标题】:How to create an array of 20 random bytes? 【发布时间】:2011-08-06 16:39:18 【问题描述】:

如何在 Java 中创建一个包含 20 个随机字节的数组?

【问题讨论】:

【参考方案1】:

试试Random.nextBytes 方法:

byte[] b = new byte[20];
new Random().nextBytes(b);

【讨论】:

值得一提的是,这不是加密安全的。如果需要,请参阅other answer。【参考方案2】:

如果您想要一个加密强的随机数生成器(也是线程安全的)而不使用第三方 API,您可以使用SecureRandom

Java 6 和 7:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

Java 8(更安全):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

【讨论】:

【参考方案3】:

如果您已经在使用 Apache Commons Lang,RandomUtils 将使其成为单行:

byte[] randomBytes = RandomUtils.nextBytes(20);

注意:这不会产生加密安全字节。

【讨论】:

在进行了一些挖掘之后,RandomUtils 在后台使用 Math.random(),而不是 SecureRandom。只是想明确这一点。 这个方法已经不存在了。 @MartijnHiemstra 它确实存在:github.com/apache/commons-lang/blob/master/src/main/java/org/… @DuncanJones 我正在使用使用 Commons lang 3.7 的 Spring boot 2,它已被删除。查看源代码显示它已被注释掉。所以我不会相信这段代码,因为升级可能会使你的代码无法编译。 @MartijnHiemstra 我查看了最新的文档:commons.apache.org/proper/commons-lang/apidocs/index.html 以及 3.7 版的文档:commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/… 他们似乎都有 nextBytes 方法。也许 spring boot 没有导入正确的库?【参考方案4】:

Java 7 引入了ThreadLocalRandom,它与当前线程隔离

这是maerics's solution 的另一个版本。

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);

【讨论】:

ThreadLocalRandom 后面的括号可能太多了?更好:ThreadLocalRandom.current().nextBytes(bytes);【参考方案5】:

使用种子创建一个 Random 对象,并通过以下方式随机获取数组:

public static final int ARRAY_LENGTH = 20;

byte[] byteArray = new byte[ARRAY_LENGTH];
new Random(System.currentTimeMillis()).nextBytes(byteArray);
// get fisrt element
System.out.println("Random byte: " + byteArray[0]);

【讨论】:

【参考方案6】:

对于那些想要更安全的方法来创建随机字节数组的人来说,是的,最安全的方法是:

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

但是如果机器上没有足够的随机性可用,您的线程可能会阻塞,具体取决于您的操作系统。以下解决方案不会阻塞:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

这是因为第一个示例使用 /dev/random 并且会在等待更多随机性(由鼠标/键盘和其他来源生成)时阻塞。第二个例子使用/dev/urandom,不会阻塞。

【讨论】:

只有在要求及时性而不是正确性的情况下,或者在这种情况下是真正的随机性时,才应该使用此示例。 /dev/urandom 如果不能创建真正的随机性,则不会阻塞,并且会尽力而为。 /dev/random 将阻塞直到随机性得到保证。

以上是关于如何创建一个包含 20 个随机字节的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一定范围内创建随机数组

在 20 个整数的数组中搜索并计算单个随机数

java程序,随机产生包含20个元素的数组,求出数组中的最大值,最小值和平均值

在 Swift 中创建一个随机数数组

JAVA中如何产生20个不同的随机数?

在 C# 中使用线程填充随机数的数组