我想创建一个随机的字母数字字符串,其位数始终为 k。大小 k 会比较大(从 128 变化到 2048 或更大)。我正在阅读这个优秀的线程,我正在尝试使用and类来解决问题,但无济于事。Random
SecureRandom
更准确地说,结果不一定是字符串,它可以是任何东西,只要它是随机的并且它的位数始终为 k。
我想创建一个随机的字母数字字符串,其位数始终为 k。大小 k 会比较大(从 128 变化到 2048 或更大)。我正在阅读这个优秀的线程,我正在尝试使用and类来解决问题,但无济于事。Random
SecureRandom
更准确地说,结果不一定是字符串,它可以是任何东西,只要它是随机的并且它的位数始终为 k。
你检查过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];
另一种可能性是BigInteger
构造函数:BigInteger(int numBits, Random rnd)
.
根据您需要随机位的安全程度,使用Random
或SecureRandom
作为第二个参数。有多种方法可以将 a 转换为BigInteger
您想要的任何最终格式。要获取字符串,请使用BigInteger.toString(2)
其中 2 是二进制的基数。
如果您真的想要特定数量的位,并且不能满足字节可以做的 8 的倍数,请尝试使用布尔值SecureRandom
SecureRandom sr = new SecureRandom();
boolean bools[] = new boolean[k];
for(int x = 0; x < bools.length; x++){
bools[x] = sr.nextBoolean();
}