java - UUID 生成的字符类型

标签 java uuid

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

最佳答案

tl;博士

你问:

Does java.util.UUID generates special characters?

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

UUID 的文本表示通常是一串十六进制数字(0-9、a-f、A-F)加上连字符。


你问:

What are the type of each character (eg- Uppercase, lower case, digits) generated by UUID.

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

UUID ≠ 文本

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

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

十六进制字符串

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

550e8400-e29b-41d4-a716-446655440000

没有“特殊”字符

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

abcdefABCDEF1234567890-

规范要求小写

2008-08 年最新的 international spec 状态(重点是我的):

6.5.4 Software generating the hexadecimal representation of a UUID shall not use upper case letters. NOTE – It is recommended that the hexadecimal representation used in all human-readable formats be restricted to lower-case letters. Software processing this representation is, however, required to accept both upper and lower case letters as specified in 6.5.2.

常见违规行为

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

照规范说的做:

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

UUID 类的 toString 方法的 Java 文档记录了 BNF 在生成字符串时允许使用大写字母,这与 UUID 标准规范相矛盾。但是,Java 8 的 Oracle implementation 中的类及其 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

看到这个 code run live in IdeOne.com

零值

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

00000000-0000-0000-0000-000000000000

示例值

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

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

关于java - UUID 生成的字符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8258480/

相关文章:

java - 为什么我注入(inject)的依赖的方法没有运行?

java - 填充微调器

Java 编译带有 spring "Validator"类的警告

ios - Apple Healthkit 是否存储开发人员可以检索的唯一标识符 (UUID)?

c++ - 如何在 __declspec(uuid ("ComObjectGUID ") 中传递动态值

java - 在 Java 中将 UUID 编码为 Base62(而非 Base64)

ruby-on-rails - 使用 uuid-ossp 在 Rails 中将模型 id 更改为 uuid

java - Spring security 无法将属性 'secRole' 的类型 [java.lang.String] 的值转换为所需类型 [SecRole]

java - MySQL 从左连接中选择一列中具有特定数量的不同值的行,但没有总行数限制

c - 请用 C 语言编写简单的随机字符串生成函数。给我看看你的艺术!