我正在写一个类,当被调用时,它将调用一个方法,以使用系统时间生成一个唯一的8个字符的字母数字作为引用ID。但我担心在某些时候,可能会在同一毫秒内进行多次调用,导致相同的引用ID。我如何才能从可能同时调用此方法的多个线程中保护此对系统时间的调用?
发布于 2012-09-13 00:46:54
系统时间不是唯一Ids的可靠来源。就这样。不要用它。您需要某种形式的永久来源(UUID使用由操作系统提供的安全随机种子)
系统时间可能会倒退几毫秒,完全毁掉你的逻辑。如果你只能容忍64位,你要么使用High/Low generator,这是一个非常好的折衷方案,要么自己做饭:比如从2012年初开始的18位(你还有700多年的时间),然后来自SecureRandom的46位随机性-不是最好的情况,从技术上讲它可能会失败,但它不需要外部持久性。
发布于 2012-09-13 01:06:00
我建议将threadID添加到引用ID中。这将使引用更具唯一性。然而,即使在线程内,对时间源的连续调用也可能传递相同的值。即使对最高分辨率源(QueryPerformanceCounter)的调用也可能在某些硬件上产生相同的值。这个问题的一个可能的解决方案是对照它的前身测试收集的时间值,并将增量项添加到“时间戳”中。您可能需要8个以上的字符,而这应该是人类可读的。时间戳最有效的来源是GetSystemTimeAsFileTime应用编程接口。我在this answer中写了一些细节。
https://stackoverflow.com/questions/12392732
复制相似问题