UUID到唯一的整数id?

时间:2011-04-06 08:32:08

标签: java uuid

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

那么最简单的方法是什么?哈希码是唯一的吗?

6 个答案:

答案 0 :(得分:31)

由于UUID为128位且int仅为32位,因此您将遇到问题。您要么必须接受碰撞的风险并尝试将其推向更小的空间(hashCode可能是一种很好的方法)或找到替代方案(直接使用UUID,地图到BigInteger - 在不知道原因的情况下很难分辨出来)

答案 1 :(得分:11)

回答我怎么能拥有一个独特的应用程序范围整数:

如果重新启动后需要是唯一的,或者如果您的应用程序是群集的,则可以使用数据库序列。

如果它在运行时只需要是唯一的,请使用静态AtomicInteger

编辑(已添加示例):

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

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

用法:

int nextValue = Sequence.nextValue();

这是线程安全的(不同的线程将始终接收不同的值,并且没有值会“丢失”)

答案 2 :(得分:3)

不,哈希码不是(也不可能)唯一的。具有GUID / UUID的东西是你需要所有128位以保证唯一性,因此以任何方式缩小它都会产生问题,参见例如GUIDs are globally unique, but substrings of GUIDs aren't

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

答案 3 :(得分:1)

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

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

一种出路 - 一些现实生活中的UUID通常具有相当静态的部分。因此,在隔离的情况下,UUID 真实唯一部分可能小于32位。

答案 4 :(得分:1)

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

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

  2. 现在我们有了crc64(8个字节)。取前N个字节(在本例中为 在您的5个字节中,int的字节为4个字节,int64的字节为所有字节)

我们测试了此方法,它适用于数百万个UUID。

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

答案 5 :(得分:-2)

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

              BigInteger  big = new BigInteger(uuid, 16);