我想知道将UUID转换为唯一整数的最简单方法是什么?我尝试过使用哈希码,但人们告诉我,如果我使用哈希码,它不会总是唯一的吗?
那么最简单的方法是什么?哈希码是唯一的吗?
答案 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转换为序列号。最后,我们测试并使用了下一个算法:
使用ECMA多项式获取uuid(16个字节)的CRC64 0xC96C5795D7870F42。不要使用ISO多项式,因为它可能会导致 某些UUID生成算法会发生很多冲突。
现在我们有了crc64(8个字节)。取前N个字节(在本例中为 在您的5个字节中,int的字节为4个字节,int64的字节为所有字节)
我们测试了此方法,它适用于数百万个UUID。
我们的附加步骤:将5个字节的数字转换为以36为底的数字,最后得到SN:4YD3SOJB。
答案 5 :(得分:-2)
您可以将uuid转换为BigInteger并保持其唯一性。
BigInteger big = new BigInteger(uuid, 16);