I wrote the following simple test case to look at the uniformity of the
distribution. I don't see any problem running it up to 4096 buckets. Admittedly
I did not do any statistical tests on the buckets but by eye they look
uniformly distributed.
public static void main(String[] args) throws Throwable {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
final int nBits = 4096;
final int nBuckets = 128;
final int count = 100000;
Pair[] buckets = new Pair[nBuckets];
BigInteger max = BigInteger.TWO.pow(nBits);
BigInteger limit = max;
BigInteger step = limit.divide(BigInteger.valueOf(buckets.length));
for (int i = 0; i < buckets.length; i++) buckets[i] = new Pair(limit =
limit.subtract(step));
for (int i = 0; i < count; ++i) {
// biased towards high numbers. never chooses below a high limit
BigInteger number = new BigInteger(nBits, sr);
int j;
for (j = 0; buckets[j].limit.compareTo(number) > 0; j++) {}
buckets[j].count++;
}
for (int i = buckets.length; i > 0; i--)
System.out.print(buckets[i-1].count + (i%8==0 ? "\n" : "\t"));
System.out.println();
}
Douglas