UUID 生成的字符类型tl;博士≠文本的 UUID十六进制字符串无“特殊”字符规范要求的小写无值示例值

2022-09-01 05:41:17
  1. java.util.UUID 会生成特殊字符吗?
  2. UUID生成的每个字符的类型(例如 - 大写,小写,数字)是什么。

答案 1

tl;博士

你问:

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

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

UUID 的文本表示形式在规范上是一串十六进制数字(0-9、a-f、A-F)和连字符。


你问:

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

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

≠文本的 UUID

为了澄清,UUID实际上是一个128位值,不是文本,不是数字。

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

十六进制字符串

人类不能很好地将128位作为128位和字符进行阅读和书写。当需要编写UUID供人类使用时,我们使用以16为基数的十六进制(数字和字母)字符串。我们使用 32 个十六进制字符和 4 个连字符分组,以总共 36 个字符表示这 128 位。例如:1009af

550e8400-e29b-41d4-a716-446655440000

无“特殊”字符

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

abcdefABCDEF1234567890-

规范要求的小写

2008-08年的最新国际规范国家(强调我的):

6.5.4 生成 UUID 的十六进制表示形式的软件不得使用大写字母。注意 – 建议将所有人类可读格式中使用的十六进制表示形式限制为小写字母。但是,处理此表示的软件需要接受 6.5.2 中指定的大写和小写字母。

违规行为常见

但是,微软,苹果和其他公司通常违反小写规则。微软一度发布了生成混合大小写的软件(同时使用大写和小写),这显然是一个意想不到的功能。

所以按照规范说:

  • 使用小写字母作为输出。
  • 允许输入为小写或大写。

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


答案 2

javadoc for java.util.UUID 链接到 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.

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