2010-08-26 208 views
0

我有问题在一个字符串(一个人的名字),回来一个独特的整数,它继续通过catch函数,我不知道为什么,除了我写SecureRandom的方式不起作用,但它非常混乱。我对编程非常陌生,所以请善待!将SecureRandom和UUID转换为int(java)?

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

谢谢您的帮助!

回答

1

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

从的Javadoc:

公共静态的SecureRandom的getInstance(字符串算法) 抛出抛出:NoSuchAlgorithmException 生成SecureRandom对象是...略...

参数: 算法 - 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,但我必须承认,这是相当紧张。

+0

OK!这更有意义,那么我可以使用该名称作为字节数组中的种子吗? – Jack 2010-08-26 20:36:44

+0

是的,我加了一个例子。 – 2010-08-26 20:45:24

0

根据该文档,NoSuchAlgorithmException抛出

...当请求特定的加密算法,但不具备的环境。

您需要指定一个随机数发生器(RNG)算法getInstance(String algorithm),而不是一个人的名字。

如果你只是需要一个随机数,尝试用

SecureRandom srA = new SecureRandom(); 

替换该行代码中的。如果你不关心多少有随机的和你只是想创建一个唯一的整数这个名字,那么我认为你所需要的就是致电hashCode这个名字。

0

如果要将字符串映射到数字,您需要散列函数或摘要。看看java.security.MessageDigest中

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