tl;博士 您问: java.util.UUID 是否生成特殊字符? 不。UUID 实际上是一个 128 位的值,而不是文本。 UUID 的文本表示形式通常是一串十六进制数字(0-9、af、AF)加上连字符。 您问: UUID 生成的每个字符的类型(例如大写、小写、数字)是什么。 根据 UUID 规范的要求,表示 UUID 值的十六进制字符串中的任何 a-to-f 字符 必须全部为小写。但违规行为比比皆是。 UUID ≠ 文本 澄清一下, UUID 实际上是 _一个 128 位的值_,不是文本,也不是数字。 您可以将它们视为 128 位无符号整数。但它们实际上并不是数字,因为某些位位置具有语义和特定含义。哪些位具有哪些含义因 变体 和 UUID 版本 而异。 十六进制字符串 人类不能很好地将 128 位读写为 128 1 和 0 字符。 When a UUID needs to be written for human consumption, we use a base-16 Hexadecimal (digits 0 - 9 and letters 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 class’ 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 值的一些示例。例如: https://www.uuidgenerator.net/ 或者使用命令行工具。几乎每个操作系统都捆绑了这样的工具。在 macOS 上,启动 Terminal.app 并键入 uuidgen 。 原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议
tl;博士
您问:
不。UUID 实际上是一个 128 位的值,而不是文本。
UUID 的文本表示形式通常是一串十六进制数字(0-9、af、AF)加上连字符。
您问:
根据 UUID 规范的要求,表示 UUID 值的十六进制字符串中的任何 a-to-f 字符 必须全部为小写。但违规行为比比皆是。
UUID ≠ 文本
澄清一下, UUID 实际上是 _一个 128 位的值_,不是文本,也不是数字。
您可以将它们视为 128 位无符号整数。但它们实际上并不是数字,因为某些位位置具有语义和特定含义。哪些位具有哪些含义因 变体 和 UUID 版本 而异。
十六进制字符串
人类不能很好地将 128 位读写为 128
1
和0
字符。 When a UUID needs to be written for human consumption, we use a base-16 Hexadecimal (digits0
-9
and lettersa
-f
) 字符串。我们使用 32 个十六进制字符和 4 个连字符分组来表示总共 36 个字符中的 128 位。例如:没有“特殊”字符
至于问题中提到的“特殊字符”,您只会在 UUID 的十六进制字符串表示中看到这 23 个可能的字符:
规范要求小写
最新的 国际规范 日期为 2008-08 状态(强调我的):
常见违规行为
但是,Microsoft、Apple 和其他公司通常违反小写规则。有一次,Microsoft 发布了生成 _混合大小写_(使用大写和小写)的软件,这显然是一种意外的功能。
所以按照规范说的那样做:
UUID
class’toString
方法的 Java 文档在 BNF 中记录了在生成字符串时允许大写,这与 UUID 标准规范相矛盾。然而,Java 8 的 Oracle 实现 中类及其toString
方法的实际行为是正确的,输出使用小写字母,但允许输入大写或小写。输入小写/大写:
仅输出为小写:
在 IdeOne.com 中查看此代码的实时运行。
零值
当 UUID 未知时,您可以使用一个由全零组成的特殊 UUID。
示例值
您可以使用许多生成值的网站中的任何一个来查看 UUID 值的一些示例。例如:
或者使用命令行工具。几乎每个操作系统都捆绑了这样的工具。在 macOS 上,启动 Terminal.app 并键入
uuidgen
。