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