我正在尝试使用SecureRandom生成一个字母数字字符串。
这是我的小代码:
import java.math.BigInteger;
import java.security.SecureRandom;
public class GenerateSecureRandom {
private static SecureRandom SECURE_RANDOM = new SecureRandom();
public static String nextSessionId() {
return new BigInteger(64, SECURE_RANDOM).toString(16);
}
}
有效!我举个例子:7c52cfce6c479803 = 16个字符:OK!
我的问题是有时此代码返回15个字符的字符串,我不明白为什么。 (我是初学者......)
以下是一个示例:515c38584d0a077 = 15个字符:ERROR
我做错了什么?
我是Java编程的初学者,所以如果我的处理方式不正确,请放纵:)
如果此代码不正确,我该如何获得预期结果?我想使用SecureRandom。
提前感谢您的回答
很抱歉,如果我的问题重复,我搜索时没有找到答案......
答案 0 :(得分:3)
BigInteger
constructor you're using获取最大位长度。
构造一个随机生成的BigInteger,均匀分布在0到(2 numBits - 1 )的范围内,包括在内。
<强>参数:强>
numBits
- 新BigInteger的最大bitLength。
你可能更少得到甚至少于15个字符的字符串。
这是因为最高有效位可能为零,导致十六进制数不需要需要表示完整的16个字符。请注意,您生成的所有字符串均不以0
开头。
如果少于16个字符,则前缀'0'
个字符。