删除随机生成的UUID中的“-”有多安全?

时间:2018-08-13 21:30:30

标签: java uuid

我有此代码:

String uuid = UUID.randomUUID().toString().replace("-", "");

在生成的UUID中删除“-”有多安全?删除它是否会破坏其在全球范围内唯一的目的,并使生成的UUID易于发生冲突?

6 个答案:

答案 0 :(得分:99)

  

在生成的UUID中删除“-”是否安全

因为破折号不是值的一部分,所以它是100%安全的。字符串UUID是128位值的十六进制表示。此处的破折号仅用于显示目的,因此UUID在眼睛上会更容易一些。

在将String形式的UUID传递到外部系统(例如外部API,数据库以及类似性质的东西)时,请务必小心。他们可能希望破折号在那里。

答案 1 :(得分:45)

假设我想给白宫打电话。他们的电话是(202)456-1111。如果我从该电话号码中删除所有的破折号和括号,那么我会留下2024561111。在执行此操作的过程中,我没有丢失任何信息-我只是更改了格式,以使其更难以阅读。如果我将此号码打入手机,它仍然可以正确拨打电话,因为电话系统仍然知道前三位数字是区号,而后七位是主号码。

以同样的方式,UUID中的破折号就像电话号码中的标点符号一样-因为包含了这些破折号,因此人们可以更轻松地读取一些大的数字。在UUID中,该数字的长度为128位,并且以十六进制形式编写,因此与电话号码不同,该数字“显然”较少,但基本原理相同。删除破折号不会更改数字,因此不会影响安全性。

现在,发生的可能是,这样做会破坏跨平台的格式兼容性。让我们回到电话号码类比。我使用过的某些网站不允许我输入2024561111作为电话号码。他们会坚持要求我输入空格,破折号和括号,例如(202)456-1111。 (我不喜欢这样的网站,但这是另一回事。)因此,如果您需要将UUID的字符串表示形式传递给其他期望使用UUID的字符串或进程,则从UUID中删除破折号可能是一个问题。完整格式,包括逗号。

答案 2 :(得分:10)

格式正确的UUID中的破折号不会随机放置在字符串中-这是RFC中详细说明的特定格式-http://www.ietf.org/rfc/rfc4122.txt

因此,删除破折号不会影响UUID的唯一性。

但是,这可能会导致库出现问题,希望将破折号作为UUID的一部分来将其验证为UUID。

为什么要删除它们?

答案 3 :(得分:9)

您可以通过阅读the javadoc来检查字符串的创建方式:

UUID                   = <time_low> "-" <time_mid> "-"
                      <time_high_and_version> "-"
                      <variant_and_sequence> "-"
                      <node>
time_low               = 4*<hexOctet>
time_mid               = 2*<hexOctet>
time_high_and_version  = 2*<hexOctet>
variant_and_sequence   = 2*<hexOctet>
node                   = 6*<hexOctet>

因此可以删除-,可以在以后根据需要将它们重新插入正确的位置,或者重新创建包含相同信息的UUID对象。

关于唯一性:How unique is UUID?

答案 4 :(得分:8)

UUID是一个128位数字。

带有连字符的十六进制格式仅是供人类使用的显示呈现。它是几种可能的显示效果之一,并且带有或不带有连字符的显示格式不是UUID本身。

答案 5 :(得分:1)

UUID是一个128位数字。数字rc01的四位指示UUID版本,数字M的一至三个最高有效位指示UUID变体。 UUID的二进制编码在系统之间有所不同。许多系统完全以big-endian格式编码UUID。