【问题标题】:How to create a random output of a certain bit size in Java?如何在 Java 中创建一定位大小的随机输出?
【发布时间】:2016-02-13 18:08:15
【问题描述】:

我想创建一个随机的字母数字字符串,其 bit 计数将始终 大小为 k。大小 k 会相对大一些(从 128 变化到 2048 或更大)。我正在阅读this excellent thread,我正在尝试使用RandomSecureRandom 类来解决问题,但无济于事。

更准确地说,结果不一定是字符串,它可以是任何东西,只要它是 random 并且它的 bit 计数始终是ķ。

【问题讨论】:

  • 使用BigInteger
  • 如何计算字母数字字符串的位数?
  • 生成正确大小的字节数组很容易:只需使用SecureRandom.nextBytes(byte[])。向上舍入到最接近的 8 位,如果需要,请忽略其他位...
  • 如果您已经阅读了回答您问题的帖子,您应该准确解释为什么您仍然认为需要打开一个新问题。考虑到所述线程已经提供了包含完整工作代码的答案,“我正在尝试使用……但无济于事”这句话是无法理解的。

标签: java random bit secure-random


【解决方案1】:

另一种可能性是BigInteger 构造函数:BigInteger(int numBits, Random rnd)

根据您需要的随机位的安全程度,使用RandomSecureRandom 作为第二个参数。有多种方法可以将 BigInteger 转换为您想要的任何最终格式。要获取字符串,请使用BigInteger.toString(2),其中 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();
    }
    

    【讨论】:

      【解决方案3】:

      你检查过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];

      【讨论】:

      • 这可能是一个愚蠢的问题,但使用这种方法总是会产生完全相同的结果,更具体地说是[B@a881b5。这应该发生吗?每次运行时我都想要一个不同的随机输出。
      • [B@a881b5 不是数据,而是您执行 System.out.print(random) 时数组的 ID - 请参阅docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/… 了解。要获取字符串表示,请使用 java.util.Arrays.toString()
      猜你喜欢
      • 2013-10-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2023-04-02
      • 2017-12-07
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多