gpt4 book ai didi

java - 使用以下逻辑生成唯一的随机数。但看起来它失败了

转载 作者:行者123 更新时间:2023-12-02 12:46:25 27 4
gpt4 key购买 nike

当从一个线程连续调用时,下面的代码生成相同的最后 7 位数字的可能性有多大?

try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
String temp = String.valueOf(System.currentTimeMillis());
return new BigInteger(temp).add(BigInteger.valueOf(new Long(activityIdCounter.incrementAndGet())));

activityIdCounterAtomicInteger上面的代码片段是 static synchronized .

我问这个问题是因为我发现我的测试用例由于现有 ID 被重用而间歇性失败。这是获取唯一 ID 的一部分。

现在我已经改成System.nanoTime()但我不知道如何

  1. 可能会生成重复的数字,并且
  2. 当前生成的 ID 与数据库中已存在的 6 天前的 ID 匹配。

让我简单解释一下 generateId() 是如何做到的方法被调用。

测试类每次调用数据库时都会顺序调用它两次,以生成两个不同的 id,并且两个 id 都会保留。任何其他调用或测试方法也会执行相同的操作。但是为了使操作在数据库中成功,如果这些ID已存在于数据库中,则将搜索该ID,如 ...where id1=:id1 and id2=:id2 .

现在这是我的 TestNG 配置:

<test verbose="2" name="FullTestSuite" annotations="JDK" preserve-order="true" parallel="classes" thread-count="10">

编辑:id 创建逻辑

id1 = new BigInteger(<12-13 digits - constant>).add(<generated id>).toString();
id2 = "someString:" + id1 + ":" + generatedId; //call again for those 7 digits

最佳答案

如果仅使用 7 位数字,则可能有 10 000 000 个不同的值。假设您在该范围内完全随机挑选号码,那么在挑选 3723 个号码后,生成重复号码的几率将大于 50%。经过 6785 次挑选后,生成重复的几率超过 90%。

当然你不是随机挑选它们,而是试图让它们增加。但如果您只选择最后七位数字,那么纯粹基于时间,您会在 10 000 000 毫秒后发生溢出,或者每 2 小时 46 分钟 40 秒发生一次溢出。由于您在毫秒中添加的数字不断增加,因此该时间段将变得越来越短。

另请注意,由于您使用 System.currentTimeMillis(),您会受到其他进程(尤其是进行 NTP 同步的进程)对系统时钟的更改的影响。这意味着连续两次调用 System.currentTimeMillis() 可能会在第二次调用时看到较低的值。

结论:为了安全地生成唯一的 ID,您必须使用更多的数字。事实上,不要重新发明轮子,使用 UUID.randomUUID()

关于java - 使用以下逻辑生成唯一的随机数。但看起来它失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44758447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com