Java:80位数(寻找好的方法)

时间:2012-03-06 06:07:46

标签: java java-ee data-structures

我需要在java中生成80位随机数(非非重复)。

我该怎么做?

我计划使用当前的时间戳来做到这一点。这给了我8个字节,休息了2个字节。我可以添加其他内容....请让我知道您的意见,我该怎么做...

或者如果您有任何其他想法来实现相同的...

请考虑系统重启案例

3 个答案:

答案 0 :(得分:3)

尝试结合使用Random#nextBytes(byte[])new BigInteger(byte[])

Random rand = new Random();
BigInteger r = new BigInteger(80, rand);
// or
byte bs[10];
rand.nextBytes(bs);
BigInteger r80bits = new BigInteger(bs);

[编辑] 听起来你对独特性比对随机性更感兴趣,特别是几乎没有机会使用相同的数字,在这种情况下,时间戳可能更有用。这是实现这一目标的一种方式,或多或少:

public static byte[] get80UniqueBits() {
  // Put eight very likely unique bytes.
  ByteBuffer buf = ByteBuffer.allocate(10);
  buf.putLong(System.nanoTime());
  // And two random bytes for good measure.
  byte bytes[] = {0, 0};
  new Random().nextBytes(bytes);
  buf.put(bytes, 0, 2);
  return buf.array();
}

请注意,最后两个字节不是绝对必要的。

答案 1 :(得分:1)

从你的意思上讲,时间戳并不是真正随机的。在它总是增加的意义上,它甚至不是伪随机的。

如果你想要一个80位的生成器,我之前已经实现了类似的东西,尽管生成器函数的输出较小。

您基本上使用nextLong来获取64位随机值。然后将位从那里复制到其他16位位置。

你看到一个64位周期的方式是你复制的位位置(“位集”)每次迭代都不同,并且有一个素数的迭代(11,31,97,... )。

因此,例如,在迭代0,您可以将位1,7,9,11,3,... 12复制到其他16位位置。在下一次迭代中,您将复制一组不同的位。

这样,当真实发生器循环时,你很可能会处于不同的位集(由于它的主要大小)并且它们不会重复。

当然,更好的解决方案是找到一个真正的80位发生器 - 我只是提供这个解决方案来让事情快速发展。除非你是一个密码学家或一个统计学家,否则它会很好(但是再一次,64位生成器会被调用两次,值可能会移动和组合)。

答案 2 :(得分:0)

Random generator = new Random();
new BigInteger(80, generator);

如果您不想复制数字,除非明确维护Set之前看到的数字并检查Set,否则不会,也绝不会有任何方法可以避免它。