我有一个在 java 中生成唯一 ID 的逻辑,如下所示,
private static String generateUniqueNum()
{
final int LENGTH = 20;
final long uniqueNumber = abs(Long.valueOf(UUID.randomUUID().hashCode())) + System.currentTimeMillis() + abs(random.nextLong());
String value = Long.toString(uniqueNumber).replaceAll("-", "");
final int endIndex = value.length() <= LENGTH ? value.length() : LENGTH;
return String.format("MN%s", value.substring(0, endIndex));
}
private static Long abs(Long number){
if(null == number || 0 < number){
return 0L;
}
return Math.abs(number);
}
对于上面的代码,我用 jmeter 同时测试了 3000 个请求,当我检查生成的结果值时,生成了很多重复的值。我不知道重复值是如何产生的原因。有人对此有任何想法吗。
提前致谢。
最佳答案
UUID 是唯一的,但使用 128 位(两个长整数)。
最好使用数据库键,例如字符串表示。对于不太安全的 long
:
return uuid.getLeastSignificantBits() ^ uuid.getMostSignificantBits();
您的冲突源于哈希码是一个 int(32 位,四分之一),与其他属性结合不一定会使数字更随机;更不用说了。
关于java - 在java中生成唯一值给出重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56043187/