不带破折号的UUID是否有效?

30

我想编写简单的正则表达式来验证UUID,但我不确定这个小细节。

维基百科指出:

UUID由32个小写十六进制数字表示,以连字号分隔成五组,格式为8-4-4-4-12,总共36个字符(32个字母数字字符和四个连字符)。

但在RFC规范文件中找不到类似的内容。

所以问题是这个UUID是否有效:f47ac10b58cc4372a5670e02b2c3d479


3
有效期是什么?如果您想允许它,请随意。 - SLaks
补充一下@SLaks所说的,它仍然是一个有效的GUID,但大多数内置方法可能无法解析它,但在某些情况下也可能是有效的。你只需要测试一下,或者最坏的情况下,在解析之前用连字符填充即可。 - Darren Kopp
@SLaks - 这是否意味着规范并没有真正说明表示格式的内容?这意味着维基百科通常不够准确。 - Karol
@DarrenKopp - 很好的观点。没有连字符格式和内置方法会有什么问题吗?我对这个主题还很新,所以经验不足。 - Karol
1
@Carlos 嗯,我不知道,我不知道你在使用什么系统。就像我说的,如果有问题,只需在将它们传递给类似方法之前添加连字符即可。 - Darren Kopp
1个回答

34

RFC 4122(第3节,第4页)中的生产方式,将UUID字符串表示定义为

UUID = time-low "-" time-mid "-"
       time-high-and-version "-"
       clock-seq-and-reserved
       clock-seq-low "-" node

每个内部组件都是十六进制编码。
因此,f47ac10b58cc4372a5670e02b2c3d479不是有效的UUID表示形式。

12
我正在阅读这份文件,但是从第四节开始阅读,认为正式的定义不会包含我正在寻找的信息-但事实上它确实包含了。如果你已经阅读了整个文件-那很好,但这就像指出,任何询问JS问题的人都应该阅读整个MDN文档一样。这有点无意义,而在SO上询问此类问题是完美的,因为也许有人已经这样做了,可以节省你很多时间。 - Karol
该文档有点奇怪,它指定了“十六进制八位组”,每个八位组(字节)使用两个十六进制字符(当然)。因此,您将看到 4-2-2-2-6 而不是 8-4-4-4-12。 - Maarten Bodewes
@owlstead:是的 - 在转换为例如ASCII后,您将在正常符号中看到4-2-2-2-6,但请注意UUID以十六进制符号给出。您将不会在那里看到任何“G”或其他非十六进制字母。这就是为什么它是8-4-4-4-12。 - Karol
1
我以为我已经向你解释了 :P - Maarten Bodewes
例如,您可以检查字符串是否包含有效符号:StringBuilder sb = new StringBuilder("f47ac10b58cc4372a5670e02b2c3d479"); final String res = sb .insert(8, "-") .insert(13, "-") .insert(18, "-") .insert(23, "-") .toString();UUID.fromString(res);否则,fromString() 方法会抛出异常。 - Veniamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接