如果我使用 "Long uuid = UUID.randomUUID().getMostSignificantBits()` ,发生碰撞的可能性有多大。它切断了最小有效位,所以有可能发生碰撞,对吗?
根据文档,静态方法 UUID.randomUUID()
生成类型 4 的 UUID。
这意味着有 6 个比特用于某些类型信息,其余 122 个比特是随机分配的。
这 6 个非随机位的分配是:4 个位在 UUID 的最显著部分,2 个位在最不显著部分。因此,UUID 最显著的一半包含 60 个随机比特,这意味着平均需要生成 2^30 个 UUID 才能发生碰撞(而完整的 UUID 为 2^61)。
因此,我认为这是很安全的。但要注意的是,正如卡尔-塞勒伯格(Carl Seleborg)所提到的,其他类型的 UUID 绝对不是这样。
顺便提一下,使用 UUID 最小有效值的一半(或使用 SecureRandom 生成一个随机长)会稍好一些。
Raymond Chen 在这方面有一篇非常出色的博文: