【问题标题】:Converting a SecureRandom and UUID into an int (java)?将 SecureRandom 和 UUID 转换为 int (java)?
【发布时间】:2010-08-26 20:24:25
【问题描述】:

我在输入一个字符串(人名)并取回一个唯一整数时遇到问题,它一直通过 catch 函数,我不知道为什么,除了我编写 SecureRandom 的方式不起作用,但是这很令人困惑。我对编程很陌生,所以请善待!

  public static int uinqueID(String name){
    try{
      SecureRandom srA = SecureRandom.getInstance(name);
      Integer randomA = new Integer(srA.nextInt());
      System.out.println(randomA);
      UUID uuidA = UUID.randomUUID();
      String randomNum2 = uuidA.toString();
      System.out.println(randomNum2);
      int randomB = Integer.valueOf(randomNum2);
      int uniqueID = randomA + randomB;
      return uniqueID;
    } catch(NoSuchAlgorithmException e) {
      System.err.println("I failed");
    }
    return -1;
  }

我得到的输出是: 我失败了 -1

感谢您的帮助!

【问题讨论】:

    标签: java unique uuid


    【解决方案1】:

    您不能使用此人的姓名来获取 SecureRandom 对象。它期望实现随机数生成器的名称。您可以使用“SHA1PRNG”,因为它是默认可用的。然后,您可以使用 name.getBytes() 为随机生成器播种,然后获取下一个随机数。

    来自 Javadoc:

    public static SecureRandom getInstance(字符串算法) 抛出 NoSuchAlgorithmException 生成一个...snip...

    的 SecureRandom 对象

    参数: algorithm - PRNG 算法的名称。有关标准 PRNG 算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference 中的附录 A。

    返回: 新的 SecureRandom 对象。 抛出: NoSuchAlgorithmException - 如果 PRNG 算法在调用者的环境中不可用。 自从: 1.2

    您可以跳过其余部分,因为哈希与算法一样好,向其中添加其他内容几乎不会使其更安全。

    类似:

    static int getUUID(String name) throws NoSuchAlgorithmException {
        SecureRandom srA = SecureRandom.getInstance("SHA1PRNG");
        srA.setSeed(name.getBytes());
        return new Integer(srA.nextInt());
    }
    

    我通常会使用 MessageDigest,但我必须承认这非常严格。

    【讨论】:

    • 好的!这更有意义,那么我可以将名称用作字节数组中的种子吗?
    【解决方案2】:

    如果要将字符串映射到数字,则需要哈希函数或摘要。看看 java.security.MessageDigest

    【讨论】:

      【解决方案3】:

      怎么样:

          static final long getUUID() throws NoSuchAlgorithmException {
              SecureRandom srA = SecureRandom.getInstance("SHA1PRNG");
              srA.setSeed(RandomUtils.nextLong());
              return new Long(srA.nextInt());
          }
      
      
          static final String getFixedLengthUUID() {
            try {
              return Long.toHexString(Math.abs(getUUID())) + Long.toHexString(Math.abs(getUUID()));
            } catch (Exception e) {
              return null;
          }
      }
      

      这会打印出 16 个字符的数字:

      3fc2ce6b4da08fe0
      3fba60e0b8387c58
      78cb09b976b112d3
      3c28f91c473e29ba
      203af64d1e747af6
      4934d0b4342b8f30
      3b576a97ba8f857
      76d49522cecc5c4
      5cf650ed72a55b50
      1e89acfb4a4589f3
      

      【讨论】:

        【解决方案4】:

        根据文档,NoSuchAlgorithmException 被抛出

        ...当请求特定的加密算法但在环境中不可用时。

        您需要为getInstance(String algorithm) 指定随机数生成器 (RNG) 算法,而不是人名。

        如果您只需要一个随机数,请尝试将代码中的该行替换为

        SecureRandom srA = new SecureRandom();
        

        如果您不在乎数字的随机性,而您只是想为名称创建一个唯一整数,那么我认为您只需要在名称上调用 hashCode

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-16
          • 2014-09-13
          • 2010-12-29
          • 2013-06-02
          • 2020-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多