UUID生成的字符类型

新手上路,请多包涵
  1. java.util.UUID 是否生成特殊字符?
  2. UUID 生成的每个字符的类型(例如大写、小写、数字)是什么。

原文由 minil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
1 个回答

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 字符。 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 值的一些示例。例如:

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

原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题