我有这段代码:
String uuid = UUID.randomUUID().toString().replace("-", "");
去掉生成的UUID中的“-”符号是否安全?去掉它会否破坏其全球唯一性并使生成的UUID容易发生碰撞?
如果删除生成的UUID中的“-”,会有多安全?
非常安全,因为破折号不是值的一部分。字符串UUID是128位值的十六进制表示。这些破折号只是为了显示方便,使UUID看起来更加友好。
但在将UUID以String
形式传递给外部系统(如外部API、数据库等)时,请注意小心。它们可能希望破折号存在。
现在,可能发生的情况是这样做会破坏跨平台的格式兼容性。让我们回到电话号码的比喻上。我使用过的一些网站不会让我将2024561111输入为电话号码,他们坚持要我加入空格、破折号和括号,如(202) 456-1111。(我不喜欢这样的网站,但那是另一个故事了。)因此,如果您需要将UUID的字符串表示形式传递给某个其他需要包括逗号在内的完整格式的进程或服务,则从UUID中删除连字符可能会成为问题。
您可以通过阅读Java文档来查看字符串是如何创建的:
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是一个128位的数字。
十六进制格式中带有连字符仅用于人类消费的显示呈现。这是几种可能的显示呈现之一,显示格式是否带有连字符不影响UUID本身。
-
符号总是出现在同样的位置,所以这是安全的。请参阅维基百科上的UUID格式。 - Andreas