UUID 到唯一整数 ID? ?

我想知道将 UUID 转换为唯一整数的最简单方法是什么?我已经尝试使用哈希代码,但人们告诉我,它不会总是唯一的,如果我使用哈希代码?

那么最简单的方法是什么呢? 散列代码是唯一的吗?

130446 次浏览

您将遇到一个问题,因为 UUID 为128位,而 int 仅为32位。你要么接受碰撞的风险,试着把它伪装成一个更小的空间(hashCode可能是一个很好的方法) ,要么找到一个替代方案(直接使用 UUID,映射到 BigInteger——不知道为什么很难说)

不,哈希代码不是(也不可能是)唯一的。GUID/UUID 的问题在于,您需要所有128位来保证惟一性,因此,以任何方式缩小它都会带来问题,例如 GUID 是全局唯一的,但 GUID 的子字符串不是

老实说,我认为您最好使用顺序整数,完全跳过 GUID。如果出于任何原因需要 GUID,那么使用它们,不要尝试从它们生成整数。

UUID 是一个16字节的数字(128位)。你不能把它压缩成 int(32位) ,同时保持它的唯一性。

从数学上讲: 296 UUID 将共享相同的 Java-int大小的哈希值(这是... 很多;)

出路-一些现实生活中的 UUID 通常有一个相当静态的部分。因此,在孤立的场景中,UUID 真的唯一部分小于32位。

回答我如何才能有一个独特的应用广泛的整型:

如果在重新启动后,或者如果应用程序是群集的,那么它需要是唯一的,那么您可以使用 Database 序列。

如果只是需要在运行时保持唯一,则使用静态 AtomicInteger

编辑(示例补充) :

public class Sequence {


private static final AtomicInteger counter = new AtomicInteger();


public static int nextValue() {
return counter.getAndIncrement();
}
}

用法:

int nextValue = Sequence.nextValue();

这是线程安全的(不同的线程总是会收到不同的值,而且不会“丢失”任何值)

我们需要将所有的 UUID 转换成序列号,最后,我们测试并使用了下一个算法:

  1. 使用 ECMA 多项式获取 uuid 的 CRC64(16字节) 0xC96C5795D7870F42。不要使用 ISO 多项式,因为它可能导致 一些 UUID 生成算法存在大量的冲突

  2. 现在我们有 crc64(8字节) 在你的文件中,int 是4个字节,int64是全部字节)

我们测试了这个方法,它在几百万个 UUID 中工作得很好。

我们的附加步骤: 将5字节数转换为以36为基数的数字,最后得到 SN: 4YD3SOJB。

您可以将 uuid 转换为 BigInteger 并保持其唯一性。

              BigInteger  big = new BigInteger(uuid, 16);