有没有一种方法可以生成只包含数字的随机UUID?

33

Java的UUID类生成随机的UUID。但是这些UUID由字母和数字组成。在某些应用程序中,我们仅需要数字。在Java中是否有一种方法可以生成仅由数字组成的随机UUID?

UUID.randomUUID();
9个回答

45

如果你不想要一个随机数,而是带有数字的UUID,请使用:

String lUUID = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));
在这种情况下,左侧填充了40个零...
结果为:
UUID:b55081fa-9cd1-48c2-95d4-efe2db322a54
在:
UUID:0241008287272164729465721528295504357972

如何使用带有数字的 UUID 保持插入顺序? - Panup Pong
@PanupongKongarn 请详细说明一下?你是在谈论数据库吗?如果是,那么您可以在您选择的数据库中使用另外一列(自动递增或序列)。 - Chris Eibl
如何指定它的长度? - Arslan

11

记录一下:UUID实际上是128位的数字。

你看到的字母数字字符串是使用十六进制数字(0..9A..F)表示该128位数字的形式。

真正的解决方法是将字符串转换为对应的128位数字,并且需要使用两个Longs(Long有64位)来存储它。


6
UUID uuid = UUID.randomUUID();
String numericUUID = Long.toString(uuid.getMostSignificantBits())
                   + Long.toString(uuid.getLeastSignificantBits());

我们如何指定它的长度? - Arslan
我认为UUID的长度是固定的。 - Jonathan Schneider

6

为什么不直接生成随机数字,然后将其放入所需的格式中?

这样做不能保证唯一性。(即每次生成都需要实现检查和重试逻辑)

而其他解决方案将采用UUID位并将其转换为数字,唯一性更加精细。根据您的用例,您可能仍希望使用此方法检查唯一性。


1
我有没有忘记提到它?@pheonix - jmj

5
尽管此问题的原始发布者将@Jigar Joshi的答案标记为最佳答案,但我想补充一点,在某些情况下使用UUIDs而不是随机数字是有合理性的。区别在于UUIDs是(普遍)唯一的(因此得名),而随机数则不是。当生成随机数时,您是否会获得相同的数字两次甚至更多次只是一个概率问题,但这永远不会发生在UUIDs上。因此,我认为@Chris Eibl的答案是最好的。

UUID是一个足够长的随机数,碰撞的概率极小。 - Kevin Krumwiede
1
它们曾经是真正独特的——有一个空间组件(通常等于您拥有的接口的全局唯一MAC地址)和一个时间组件(来自具有该接口的机器的时钟)。只要(a)您的平均UUID生成频率长于时钟更新间隔,(b)您的计时器与插拔接口从一个背板插入另一个计算机所需的时间相比更接近,并且(c)您内置了处理时间倒流的规定,它们确实是唯一的。 - user10762593

3
如果您只需要一个随机数,为什么要使用UUID类呢?似乎更适合使用java.util.Random类。请注意,不要删除HTML标签。

-4

最简单的方式:

uuid.uuid4().int

3
如果能解释为什么这个代码有效,而不仅仅提供代码本身,那么这个回答会更有帮助 :) - MyStackRunnethOver

-5

调用 hashCode() 方法获取 UUID 的唯一整数。


hashCode() 不是一个可逆函数,不应该用于唯一性。 - Jonathan Schneider
一个性能较差但完全正确的hashCode()实现将是return 1; - Kevin Krumwiede

-8

String uuid = UUID.randomUUID().toString().replaceAll("-", ""); //去掉“-”


3
UUIDs 包含字母。 - james.garriss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接