ランダムな20バイトの配列を作成する方法は?


130

Javaでランダムな20バイトの配列を作成するにはどうすればよいですか?

回答:



46

サードパーティの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);

16

すでにApache Commons Langを使用している場合、 RandomUtils これにより1行になります。

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

8
少し掘り下げた後、RandomUtilsは、SecureRandomではなく、内部でMath.random()を使用します。これを明示的にしたかっただけです。
Evo510 2016年

このメソッドはもう存在しません。
Martijn Hiemstra 2018


@DuncanJones私はCommons lang 3.7を使用するSpring boot 2を使用していますが、削除されました。ソースコードを表示すると、コメントアウトされていることがわかります。アップグレードするとコードがコンパイルできなくなる可能性があるので、私はこのコードを信頼しません。
Martijn Hiemstra 2018


4

シードで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]);

0

ランダムなバイト配列を作成するより安全な方法が必要な場合、はい、最も安全な方法は次のとおりです。

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

ただし、OSによっては、マシンで使用できるランダム性が十分でない場合、スレッドがブロックする可能性があります。次のソリューションはブロックしません:

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

これは、最初の例では/dev/random(マウス/キーボードおよびその他のソースによって生成された)より多くのランダム性を待っている間にブロックして使用するためです。2番目の例/dev/urandomでは、ブロックしないwhichを使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.