在随机生成的UUID中删除" - "有多安全?

xyb*_*rek 64 java uuid

我有这个代码:

String uuid = UUID.randomUUID().toString().replace("-", "");
Run Code Online (Sandbox Code Playgroud)

在生成的UUID中删除" - "有多安全?删除它会破坏它全局唯一的目的,并使生成的UUID容易发生冲突吗?

Mal*_*alt 102

如果要删除生成的UUID中的" - "是多么安全

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

String表单中的UUID传递给外部系统(如外部API,数据库和此类事物)时要小心.他们可能期望破折号在那里.


tem*_*def 47

让我们说我想打电话给白宫.他们的电话号码是(202)456-1111.如果我删除了该电话号码中的所有破折号和括号,我就留下了2024561111.在这样做的过程中我没有丢失任何信息 - 我只是改变了格式,使其更难阅读.如果我将这个号码打到我的手机中,它仍然可以正常拨打电话,因为电话系统仍然知道前三位是区号,接下来的七位是主号码.

同样地,UUID中的破折号就像电话号码中的额外标点符号 - 它们被包含在内以便人们更容易阅读一些潜在的大数字.在UUID中,这个数字是128位长并且是用十六进制写的,所以与电话号码不同,它不那么"明显"是一个数字,但基本原理是相同的.删除短划线不会更改数字,因此不会影响安全性.

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


Hor*_*Kol 10

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

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

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

你为什么要删除它们?


ass*_*ias 9

您可以通过阅读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>
Run Code Online (Sandbox Code Playgroud)

因此,删除-就可以了,如果需要,可以稍后将它们重新插入到正确的位置,或者重新创建UUID包含相同信息的对象.

关于唯一性:UUID有多独特?


Jim*_*son 8

UUID是128位数字.

带连字符的十六进制格式只是供人消费的显示呈现.它是几种可能的显示渲染之一,带或不带连字符的显示格式不是UUID本身.