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

How to generate a random alphanumeric string of 16 characters in Java using SecureRandom

我正在尝试使用 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 个字符:好的!

我的问题是 有时 这段代码 returns 是一个 15 个字符的字符串,我不明白为什么。 (我是初学者...)

这是一个例子:515c38584d0a077 = 15 个字符:错误

我做错了什么?

我是 Java 编程的初学者,所以如果我的处理方式不正确,请多多包涵:)

如果这段代码不正确,我怎样才能得到预期的结果?我想使用 SecureRandom。

提前感谢您的回答

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

BigInteger constructor you're using 需要 最大 位长度。

Constructs a randomly generated BigInteger, uniformly distributed over the range 0 to (2numBits - 1), inclusive.

Parameters: numBits - maximum bitLength of the new BigInteger.

您可能很少会得到长度小于 15 个字符的字符串。

发生这种情况是因为最高有效位可能为零,导致十六进制数 不需要 完整的 16 个字符来表示。请注意您生成的 none 字符串是如何以 0.

开头的

如果少于 16 个字符,则在前面加上 '0' 个字符。