将SecureRandom和UUID转换为int(java)?

时间:2010-08-26 20:24:25

标签: java unique uuid

我在接受一个字符串(一个人的姓名)时遇到了问题,并且获得了一个唯一的整数,它继续通过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

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

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

来自Javadoc:

public static SecureRandom getInstance(String algorithm)                                 抛出NoSuchAlgorithmException 生成一个SecureRandom对象,... snip ...

<强>参数: algorithm - PRNG算法的名称。请参阅Java密码体系结构API规范中的附录A.有关标准PRNG算法名称的信息的参考。

<强>返回: 新的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,但我必须承认这非常紧张。

答案 1 :(得分:0)

根据文档,NoSuchAlgorithmException被抛出

  

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

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

如果您只需要一个随机数,请尝试使用

替换代码中的那一行
SecureRandom srA = new SecureRandom();

如果你不在乎这个数字是多么随机,而你只是想为这个名字创建一个唯一的整数,那么我认为你所需要的只是在名字上调用hashCode。 / p>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

怎么样:

    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