For a server-side Java application I want to have a random number generator. I'm using the ISAAC algorithm from Apache Commons Math 3 because it is both cryptographically strong and fast. I have written the following code to initialise the generator:
public class ThreadLocalRandomGenerator {
private static ThreadLocal<RandomGenerator> instances = new ThreadLocal<>();
public static RandomGenerator get() {
RandomGenerator generator = instances.get();
// Initialise new generator if needed.
if (generator == null) {
int[] seed = new int[256];
seed[0] = (int) (System.currentTimeMillis() & 0xffffffffL);
seed[1] = System.identityHashCode(new Object());
for (int i=2 ; i<256 ; i++) {
seed[i] = 0;
for (int j=0; j<32; j++) {
seed[i] |= (int) ((System.nanoTime() & 1L) << j);
}
}
System.out.println("Initialised random seed: " + Arrays.toString(seed));
// Create generator.
generator = new ISAACRandom(seed);
instances.set(generator);
// Warm up.
for (int i=0 ; i<1_000 ; i++) {
generator.nextLong();
}
}
return generator;
}
}
Basically I'm using a ThreadLocal
to keep several generators around for use in threads, and I'm initialising each one using an array of integers generated from the least significant bits of nanoTime()
. The reason for using 256 integers is because that's the internal size of the ISAACRandom
class.
Does this seem sensible?