0-255の範囲で高度に保護された乱数を生成し、しかも高速なパフォーマンスで最も良い方法を教えてください。確かに私はSecureRandomクラスを使用する必要がありますが、もし私が.getInstance(SHA1PRNG)を使用しなければならないかどうかわからないか、引数なしのコンストラクタでデフォルトにする方が良いです。SecureRandomクラスを使用してJavaで乱数を生成する最も安全な方法を決定する方法
私は、これらの二つの選択肢の間で午前:
まず道
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;
}
}
Secondway:
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を使用することを示唆しています。私はどの方法が高い安全な乱数を生成し、どちらが最速のものであるかのフィードバックを得たいと思います。
ありがとうございます。
あなたは本当に決定する方法を求めて、あるいは答えがあるだけで何していますか? – EJP
@ EJPそれを決める方法を知りたいですか?ベンチマークやSystem.nanoTime()を使用してスピード性能テストを行うことができますが、どちらがより安全であるかを判断する方法はわかりません。 –