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

我有这个密码:

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

在生成的 UUID 中删除“-”是否安全?删除它是否会破坏其全局唯一性的目的,并使生成的 UUID 容易发生冲突?

20196 次浏览

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

这是百分百安全的,因为破折号不是价值的一部分。字符串 UUID 是128位值的十六进制表示形式。破折号在那里只是为了显示的目的,所以 UUID 将更容易的眼睛。

只是在将 String形式的 UUID 传递给外部系统(如外部 API、数据库等)时要小心。他们可能希望破折号在那里。

UUID 是一个128位的数字。

带连字符的十六进制格式只是供人类使用的显示呈现。它是几种可能的显示渲染之一,显示格式(带或不带连字符)不是 UUID 本身。

您可以通过读取 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对象。

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

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

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

但是,如果库希望将破折号作为 UUID 的一部分来验证它作为 UUID,那么这可能会导致问题。

你为什么要移除它们?

假设我想给白宫打电话。他们的电话号码是(202)456-1111。如果我从那个电话号码中删除所有的破折号和括号,我就只剩下2024561111了。在这个过程中我没有丢失任何信息-我只是改变了格式,使其更难阅读。如果我把这个号码输入我的手机,它仍然可以正常拨打电话,因为电话系统仍然知道前三位是区号,后七位是主要号码。

同样,UUID 中的破折号就像电话号码中的额外标点符号——它们被包含在内,这样人们就更容易读懂一些底层的大号码。在 UUID 中,这个数字是128位长,用十六进制表示,所以与电话号码不同,它不那么“明显”是一个数字,但基本原理是一样的。删除破折号不会改变数字,因此不会影响安全性。

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

UUID 是一个128位的数字。4位数字 M表示 UUID 版本,1到3位数字 N表示 UUID 变体。UUID 的二进制编码因系统而异。许多系统完全以大端格式对 UUID 进行编码。