繁体   English   中英

UUID 生成的字符类型

[英]Type of Character generated by UUID

  1. java.util.UUID 会生成特殊字符吗?
  2. UUID 生成的每个字符的类型是什么(例如大写、小写、数字)。

tl;博士

你问:

java.util.UUID 会生成特殊字符吗?

不。UUID实际上是一个 128 位的值,而不是文本。

UUID 的文本表示规范地是一串十六进制数字(0-9、af、AF)加上连字符。


你问:

UUID 生成的每个字符的类型是什么(例如大写、小写、数字)。

根据 UUID 规范的要求,表示 UUID 值的十六进制字符串中的任何 a-to-f 字符必须全部为小写 但违规行为比比皆是。

UUID ≠ 文本

澄清一下, UUID实际上是一个 128 位的值,不是文本,也不是数字。

您可以将它们视为 128 位无符号整数。 但它们实际上并不是数字,因为某些位位置具有语义、特定含义。 哪些位具有哪些含义因 UUID 的变体版本而异。

十六进制字符串

人类不能很好地将 128 位读写为 128 个10字符。 当需要编写 UUID 供人类使用时,我们使用 base-16十六进制(数字0 - 9和字母a - f )字符串。 我们使用 32 个十六进制字符和 4 个连字符来表示总共 36 个字符中的 128 位。 例如:

550e8400-e29b-41d4-a716-446655440000

没有“特殊”字符

至于问题中提到的“特殊字符”,您只会在 UUID 的十六进制字符串表示中看到这 23 个可能的字符:

abcdefABCDEF1234567890-

规范要求的小写

日期为 2008-08 的最新国际规范指出(重点是我的):

6.5.4 生成 UUID 的十六进制表示的软件不得使用大写字母。 注 — 建议将所有人类可读格式中使用的十六进制表示限制为小写字母。 然而,处理这种表示的软件需要接受 6.5.2 中规定的大小写字母。

常见违规行为

但是,Microsoft、Apple 和其他公司通常会违反小写规则。 有一次,Microsoft 发布了生成混合大小写(使用大写和小写)的软件,这显然是一个意外的功能。

所以按照规范说:

  • 输出时使用小写。
  • 允许输入小写或大写。

UUID类的toString方法的 Java 文档在BNF中记录,生成字符串时允许大写,这与 UUID 标准规范相矛盾。 然而,该类的实际行为及其在 Java 8 的Oracle 实现中的toString方法是正确的,使用小写作为输出,但允许输入大写或小写。

以小写/大写形式输入:

UUID uuidFromLowercase = UUID.fromString ( "897b7f44-1f31-4c95-80cb-bbb43e4dcf05" ); 
UUID uuidFromUppercase = UUID.fromString ( "897B7F44-1F31-4C95-80CB-BBB43E4DCF05" );

仅输出为小写:

System.out.println ( "uuidFromLowercase.toString(): " + uuidFromLowercase );
System.out.println ( "uuidFromUppercase.toString(): " + uuidFromUppercase );

uuidFromLowercase.toString(): 897b7f44-1f31-4c95-80cb-bbb43e4dcf05

uuidFromUppercase.toString(): 897b7f44-1f31-4c95-80cb-bbb43e4dcf05

查看此代码在 IdeOne.com 中实时运行

零值

当 UUID 未知时,您可以使用由全零组成的特殊 UUID。

00000000-0000-0000-0000-000000000000

示例值

您可以使用许多生成值的网站中的任何一个来查看 UUID 值的一些示例。 例如:

或者使用命令行工具。 几乎每个操作系统都捆绑了这样的工具。 在 Mac OS X 上,启动Terminal.app并输入uuidgen

java.util.UUID的 javadoc 链接到RFC 4122 ,它说

 Each field is treated as an integer and has its value printed as a zero-filled hexadecimal digit string with the most significant digit first. The hexadecimal values "a" through "f" are output as lower case characters and are case insensitive on input.

所以不,它不会生成特殊字符。

UUID 不包含字符,除非您要求将其转换为字符串。 那时,它将变成由十六进制字符和连字符组成的字符串, UUID.toString()的文档所述

(没有记录十六进制数字是大写还是小写。)

根据Internet RFC 4122

每个字段都被视为一个整数,并将其值打印为一个以零填充的十六进制数字字符串,最高有效数字在前。 十六进制值“a”到“f”作为小写字符输出,输入时不区分大小写。

如果您尊重互联网标准,请始终使用小写字母。

虽然 BNF 定义了大写字母,但它是用于输入的,而不是用于输出的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM