0〜255の範囲で、さらに高速なパフォーマンスで高度に安全な乱数を生成する最良の方法はどれか疑問に思っています。確かに SecureRandom クラスを使用する必要があると思いますが、.getInstance(SHA1PRNG) を使用する必要があるかどうか、または引数コンストラクターなしでデフォルトにする方がよいかどうかはわかりません。
私はこれらの2つの選択肢の間にあります:
最初の方法
public class RandomGenerator {
private static final String sha1prng = "SHA1PRNG";
private final SecureRandom csprng;
private final byte[] bytes = new byte[1];
public RandomGenerator() {
try {
csprng = SecureRandom.getInstance(sha1prng);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
csprng.nextBoolean();
}
protected int generateByte() {
do {
csprng.nextBytes(bytes);
} while (bytes[0] == 0);
return ((byte)(bytes[0] & 0xff) + 256) % 256;
}
}
セカンドウェイ:
public class SomethingThatNeedsRandomBytes {
private static final int NUMBER_OF_RANDOM_BYTES = ... ;
private final SecureRandom csprng;
SomethingThatNeedsRandomBytes(SecureRandom csprng) {
if (csprng == null)
throw new IllegalArgumentException();
this.csprng = csprng;
}
void doSomethingInvolvingRandomness() {
byte[] bytes = new byte[NUMBER_OF_RANDOM_BYTES];
csprng.nextBytes(bytes);
// Do something with random bytes here.
}
}
私はこのサイトで他の多くの回答を見てきましたが、それらのほとんどはSHA1PRNGを使用せずにデフォルトにすることを提案していますが、一方で、NativePRNG(高速ではないため好みません)またはSHA1PRNGを使用することを提案する他の回答もあります. どの方法が安全性の高い乱数を生成し、どの方法が最も速いかについてのフィードバックが欲しいです。
前もって感謝します。