【发布时间】:2019-12-25 00:22:15
【问题描述】:
Java 的 UUID 类生成一个随机的 UUID。但这由字母和数字组成。对于某些应用程序,我们只需要数字。有没有办法生成仅由 Java 中的数字组成的随机 UUID?
UUID.randomUUID();
【问题讨论】:
Java 的 UUID 类生成一个随机的 UUID。但这由字母和数字组成。对于某些应用程序,我们只需要数字。有没有办法生成仅由 Java 中的数字组成的随机 UUID?
UUID.randomUUID();
【问题讨论】:
如果您不想要随机数,但只需要带有数字的 UUID,请使用:
String lUUID = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));
在这种情况下,左填充为 40 个零...
结果:
UUID:b55081fa-9cd1-48c2-95d4-efe2db322a54
在:
UUID : 0241008287272164729465721528295504357972
【讨论】:
郑重声明:UUID 实际上是 128 位数字。
您所看到的字母数字字符串是使用十六进制数字 (0..9A..F) 表示的 128 位数字。
真正的解决方案是将字符串转换为其对应的 128 位数字。要存储它,您需要两个 Long(Long 有 64 位)。
【讨论】:
为什么不直接生成Random 号码并将其转换为您想要的格式?
这不会给您开箱即用的独特性。 (即您必须对每一代执行检查并重试逻辑)
其他采用 UUID 位并将其转换为数字的解决方案在唯一性方面将更加精细。根据您的用例,您可能仍希望使用这种方法检查唯一性。
【讨论】:
虽然这个问题的原始海报将@Jigar Joshi 的问题标记为最佳答案,但我想补充一点,在某些情况下使用 UUID 而不是随机数是有道理的。不同之处在于 UUID 是(普遍地)唯一的(因此得名),而随机数不是。在生成随机数时,您是否会两次或更频繁地获得相同的数字只是概率问题,但是对于 UUID 永远不会发生这种情况。因此,我认为@Chris Eibl 的回答是最好的。
【讨论】:
UUID uuid = UUID.randomUUID();
String numericUUID = Long.toString(uuid.getMostSignificantBits())
+ Long.toString(uuid.getLeastSignificantBits());
【讨论】:
如果您不需要 UUID,为什么要使用 UUID 类?这听起来更像是您只需要一个可以通过使用java.util.Random 类来实现的随机数。
【讨论】:
最简单的方法:
uuid.uuid4().int
【讨论】:
在 UUID 上调用 hashCode() 以获取唯一整数。
【讨论】:
hashCode() 不是可逆函数。永远不应该用于唯一性。
hashCode() 的性能不佳但完全正确的实现将是 return 1;
String uuid = UUID.randomUUID().toString().replaceAll("-", ""); //带'-'
【讨论】: