Java UUID到唯一整数id?

Java UUID到唯一整数id?,java,uuid,Java,Uuid,我想知道将UUID转换为唯一整数的最简单方法是什么?我尝试过使用散列码,但人们告诉我,如果我使用散列码,它不会总是唯一的 那么最简单的方法是什么呢?散列码是唯一的吗?由于UUID是128位,而int只有32位,因此您将遇到一个问题。您必须接受冲突的风险,并尝试将其压缩到较小的空间(hashCode可能是一个很好的方法),或者找到一个替代方法(直接使用UUID,映射到biginger-不知道为什么很难分辨)不,哈希代码不是(也不能)唯一的。GUID/UUID的问题在于,您需要所有128位来保证唯一

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


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

由于UUID是128位,而int只有32位,因此您将遇到一个问题。您必须接受冲突的风险,并尝试将其压缩到较小的空间(
hashCode
可能是一个很好的方法),或者找到一个替代方法(直接使用
UUID
,映射到
biginger
-不知道为什么很难分辨)

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


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

UUID是一个16字节(128位)的数字。您不能在保留其唯一性的同时将其压缩为
int
(32位)

从数学上讲:296个UUID将共享相同的Java大小的散列值(这是…很多;)


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

回答“如何才能拥有唯一的应用程序范围整数”:

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

如果只需要在运行时保持唯一性,请使用static

编辑(添加示例):

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

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

int nextValue = Sequence.nextValue();

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

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

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

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

  • 我们测试了这个方法,它可以很好地用于数百万个UUID


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

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

                  BigInteger  big = new BigInteger(uuid, 16);
    

    不,它不是——根据定义。另外,如果它是唯一的,那么为什么任何人都需要UUID?定义唯一的。全局的,或者只是在你的应用程序中,或者只是一点代码?只是由于一些愚蠢的规范,我需要一个应用程序唯一的整数,我想利用UUID类,但事实证明我不能缩小它的规模。如果你问一个真正的问题:我怎样才能拥有一个应用程序唯一的整数?我可以把UUID转换成它吗?然后我们就可以回答你的问题,而不仅仅是告诉你不能使用UUID来达到这个目的……你能给我一个如何使用AtomicInteger的例子吗?用法应该被编辑;显示“Counter.nextValue();”,但类名为“Sequence”。此用法仅可由单个jvm使用,群集(多个jvm)无法使用此选项。注释:1)哈希代码可能是唯一的。你不知道。2) 你不能保证UUID的唯一性。只是很有可能再也看不到碰撞。3) 即使你“以任何方式缩小规模”,你也不一定会产生任何问题。您增加了冲突的风险,是的,您需要意识到违反UUID标准的后果,但在某些情况下,这可能是完全正确的。4) 链接已断开。