1

想创建一个随机的字母数字字符串,其位数始终为 k。大小 k 会比较大(从 128 变化到 2048 或更大)。我正在阅读这个优秀的线程,我正在尝试使用and类来解决问题,但无济于事。RandomSecureRandom

更准确地说,结果不一定是字符串,它可以是任何东西,只要它是随机的并且它的位数始终为 k。

4

3 回答 3

3

你检查过http://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html吗?

如果您需要 128 位随机数据​​,则在 Java 中需要 16 个字节(因为一个字节是 8 位)所以之后(无耻地从所述 API 复制):

  SecureRandom random = new SecureRandom();
  byte bytes[] = new byte[16];
  random.nextBytes(bytes);

现在你有一个包含 128 位随机数据​​的数组。对于 2048,它是一个字节 [256];

于 2015-11-12T12:19:32.073 回答
1

另一种可能性是BigInteger构造函数:BigInteger(int numBits, Random rnd).

根据您需要随机位的安全程度,使用RandomSecureRandom作为第二个参数。有多种方法可以将 a 转换为BigInteger您想要的任何最终格式。要获取字符串,请使用BigInteger.toString(2)其中 2 是二进制的基数。

于 2015-11-12T14:28:07.773 回答
0

如果您真的想要特定数量的位,并且不能满足字节可以做的 8 的倍数,请尝试使用布尔值SecureRandom

SecureRandom sr = new SecureRandom();
boolean bools[] = new boolean[k];
for(int x = 0; x < bools.length; x++){
 bools[x] = sr.nextBoolean();
}
于 2015-11-12T13:50:58.400 回答