如何使用SecureRandom在Java中生成16个字符的随机字母数字字符串

时间:2018-04-26 16:01:54

标签: java android string biginteger alphanumeric

我正在尝试使用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。

提前感谢您的回答

很抱歉,如果我的问题重复,我搜索时没有找到答案......

1 个答案:

答案 0 :(得分:3)

BigInteger constructor you're using获取最大位长度。

  

构造一个随机生成的BigInteger,均匀分布在0到(2 numBits - 1 )的范围内,包括在内。

     

<强>参数:   numBits - 新BigInteger的最大bitLength。

你可能更少得到甚至少于15个字符的字符串。

这是因为最高有效位可能为零,导致十六进制数不需要需要表示完整的16个字符。请注意,您生成的所有字符串均不以0开头。

如果少于16个字符,则前缀'0'个字符。