java - 在java中生成唯一值给出重复项

标签 java

我有一个在 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/

相关文章:

java - 游戏中的注销流程!框架2.0,java

java - 在 Freemarker 模板中编码 base64

java - 将 2D 数组网格中的 "path"存储到列表中

java - 如何通过 GET 请求向 Spring 发送对象?

java - 如何转换代理对字符?

java - Quartz SimpleTrigger 事件立即触发,即使重复间隔晚了一段时间

javascript - 使用 postman 向运行 SparkJava 的本地主机服务器发出请求,但不能使用浏览器中的 javascript

java - 从另一个对象包含到 Lombok ToString 字段中

java - 是否有任何实时用例使用 new 运算符创建字符串对象

java - 如何加快频繁写作的速度