我将使用Snowcast https://github.com/noctarius/snowcast作为我的应用程序的唯一ID生成器。我将在Web应用程序URL中公开这些ID。
现在我有两个选项如何使用我的Spring Boot应用程序配置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
方法调用的结果,我获得了以下长值:
15617925960433665
但是基于基于Date
的纪元:
12046041089
我对较短的ID感兴趣..比如第二个,但我担心ID可能的唯一性问题。
如果有唯一身份证,你可以告诉或者根据日期使用纪元吗?
答案 0 :(得分:1)
如果您查看这些数字是如何生成的,您会看到没有更短或更长的ID,因为单个ID由多个部分组成。时间戳只是其中之一。也就是说,随着时间的偏移(前几位)的增加,ID会随着时间的推移而改变。在某些时候,long的值将从Java点切换到负值,因为所有位都被使用(即使是最高位)并且它将开始看起来是负的(或者你需要将它打印为unsigned long,将它放入一个大问题。)
无论如何说,没有短或更长的东西,但它取决于纪元偏移(自纪元开始以来已经过了多少毫克)以及单毫秒内的节点/ ID数量。
PS:如果只是在应用程序运行时生成唯一ID,两者都非常好。