当前位置: 首页 > 知识库问答 >
问题:

无重复的Java序列生成

宋高谊
2023-03-14

我有一个特定的要求,为一天生成一个唯一的序列号。即使有JVM重启,该实用程序也应该能够在不重复的情况下生成序列。

先决条件:

  • 不应使用数据库序列
  • 不应在文件系统中存储任何内容
  • 序列可以在一天中重复
  • 即使有JVM重启,序列也不应该在一天内重复(这已经通过不同的属性得到了保证)
  • 每秒的序列号为最小要求99

序列格式:#########(最多8位)

注意:这将在不同的节点实例中运行,因此保留序列的第一位数字用于标识节点。

共有1个答案

鞠隐水
2023-03-14

基于时钟的简单解决方案可能如下所示:

static int seq(int nodeId) {
    int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
    try {
        Thread.sleep(1); // introduce delay to ensure the generated values are unique
    } catch (InterruptedException e) {}
    return  val;
}

延迟可额外随机化(最多5毫秒):

static Random random = new SecureRandom();
static int seq(int nodeId) {
    int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
    try {
        Thread.sleep(1 + random.nextInt(4));
    } catch (InterruptedException e) {}
    return  val;
}
 类似资料:
  • 问题内容: 我想要一个可以生成值的伪随机序列的函数,但是该序列在每次运行时都可以重复。我想要的数据必须合理地随机分布在给定的范围内,而不必是完美的。 我想根据随机数据编写一些可以对其进行性能测试的代码。我希望每台机器上的每个测试运行的数据都相同,但是出于存储原因,我不想随测试一起运送随机数据(最终可能会变成许多兆字节)。 该模块的库似乎没有说相同的种子在任何机器上总是给出相同的序列。 编辑:如果您

  • 有没有可能以新的顺序生成一个已经存在的列表(例如,用名字填充)? 因此,列表填充如下: 现在列表中的第一个是“Player0”。 现在是否可以使用新的随机数开始此列表?所以就像下面的例子: 变成 因此,列表的顺序应该保持不变,只应更改列表中的第一个(当然还有所有后续的) 我希望你明白我的意思。

  • 我已经列出了对数。我想先根据键对它们进行排序,如果键相同,则根据值进行排序。 我尝试了以下代码,但引发了与类型不兼容的异常:无法推断类型变量T 错误: 不兼容的类型:无法推断类型变量T(参数不匹配;类对中的无效方法引用方法getKey无法应用于所需的给定类型:未找到参数:对象原因:实际参数列表和形式参数列表长度不同) 其中T、K、V是类型变量:T扩展在方法比较中声明的对象IT(ToIntFunct

  • 如何使随机数发生器不重复数字?我试过这个,但它总是重复给我数字

  • 我在搞lambdas的Java序列化。 我有两个完全独立的项目,其中只有一个类。 项目1: 项目二: 但是,在尝试反序列化可运行文件时,它会抛出一个异常,说它找不到 ...我有什么办法可以避免这种情况吗?

  • 在MySql中的SQL语句中,可以轻松地使用以下方法创建一行值: 选择1、2、3、4、5、6、7、8、9、10; 这将生成包含从1到10的数字的单行,但是否可能有包含这些值的单列。