先说一下事情的背景:

我们产品对外有两个接口,一个是基于 JSON 报文的 REST,另一个是基于 XML 报文的 CAI3G,现在要新加一个参数,yaml 文件里面的定义如下:

XXX:
  description: "XXX"
  type: string
  format: uuid

基于 Security 的原因,具体的参数名就不写了。

这里用到了一个很特殊的东西叫,format: uuid,而在这个 yaml 文件其他地方又找不到 uuid 的格式定义。

 

关于 UUID(Universally unique identifier)通用唯一识别码,简而言之,这是一个 128-bit 的数值,通过一定的算法来保证其唯一性。

具体的定义,推荐去看 Wiki 的介绍,或者 RFC4122 标准:

 

说回正题,yaml 的定义给了,转到 XML schema 的定义,为了限定其范围,我们需要给一个正则表达式,那么一个合规的 UUID 的格式应该是怎样的呢?

这就要说回生成 UUID 的算法了,至今为止,UUID 一共有 5 个 标准版本。

  • Version1,是根据你的当前时间戳和你的节点ID,通常是你电脑的 Mac 地址生成的
  • Version2,是根据一个标识符,通常是你的 groupId 或是 userId 生成的
  • Version3 和 Version5,是根据你的 namespace 标识符的哈希值 或者你 name 的哈希值生成的
  • Version4,是根据一个随机值,或者是伪随机值生成的

 

这里有个生成 UUID 的链接,和匹配正则表达式的网站,大家可以上去玩一下:

 

不同的版本/算法,生成的 UUID 的格式也不相同,但是总体的格式是一定的,是一个 8-4-4-4-12 的16进制数字:

[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}

但是当你确认版本后,这个范围有时候能够进一步缩小,例如 Version4 中,固定第13位是版本号4,第17位是 [8,9,a,b] 之一:

[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}

 

最后从通用性考虑,虽然在网上查到,这个参数根据 3GPP 规范,明确是 Version4 的 UUID 值,但还是用了第一种方式匹配。