Hazelcast Snowcast 序列生成器纪元和 ID 长度

Hazelcast Snowcast sequence generator epoch and id length

我将使用 Snowcast https://github.com/noctarius/snowcast 作为我的应用程序的唯一 ID 生成器。我将在 Web 应用程序 URL 中公开这些 ID。

现在我有两个选项如何使用我的 Spring 引导应用程序配置 Snowcast 音序器:

@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast) {
    Calendar calendar = GregorianCalendar.getInstance();
    calendar.set(2017, Calendar.FEBRUARY, 1, 0, 0);
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(calendar.getTimeInMillis());

    return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}

@Bean
public SnowcastSequencer snowcastSequencer(Snowcast snowcast){
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime());

    return snowcast.createSequencer("sequence_generator", snowcastEpoch);
}

作为 snowcastSequencer.next() 方法调用的结果,在基于 Calendar 的纪元的情况下,我得到以下 long 值:

15617925960433665

但在基于 Date 的纪元的情况下:

12046041089

我对较短的 ID 更感兴趣.. 就像第二个一样,但我担心 ID 可能存在唯一性问题。

你能告诉我在唯一 ID 的情况下可以使用基于日期的纪元吗?

如果您查看这些数字的生成方式,您会发现没有更短或更长的 ID,因为一个 ID 由多个部分组成。时间戳只是其中之一。也就是说,随着时间的推移,ID 会发生变化,因为纪元的偏移量(前几位)会增加。在某些时候,long 的值将从 Java 点切换为负值,因为所有位都被使用(甚至是最高位)并且它会开始看起来为负值(或者您需要将其打印为 unsigned long , 把它变成一个大整数)。

无论如何,没有短或长之分,但这取决于纪元偏移量(自纪元开始以来已经过去了多少毫秒)和一毫秒内的节点/ID 数量。

PS:如果只是在应用运行时生成唯一 ID,两者都很好。