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