我有此代码:
String uuid = UUID.randomUUID().toString().replace("-", "");
在生成的UUID中删除“-”有多安全?删除它是否会破坏其在全球范围内唯一的目的,并使生成的UUID易于发生冲突?
答案 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。