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

标签 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 个字符:好的!

我的问题是有时此代码返回一个 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 个字符。请注意,您生成的字符串都不以 0 开头。

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

关于java - 如何使用 SecureRandom 在 Java 中生成 16 个字符的随机字母数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047467/

相关文章:

android - 如何获取有关设备的声音芯片或声音功能的信息?

java - ExpandableListAdapter.getChild() 出现 NullPointerException

string - 用带有符号的 bash 拆分字符串

java - 使用TreeMap Key作为两种不同类型的集合

java - 单击按钮后打开一个新的 JFrame 并关闭先前的 JFrame

java - CORS 不允许使用 POST 方法

vb.net - VB.NET 项目中字符串插值出现 "Unexpected token"错误

java - 如何提取基本 URI?

Android内容提供者随机排序

c++ - vector 字符串推导出什么类型?