- java.util.UUID 生成的是特殊字符吗?
- UUID 生成的每个字符都是什么类型(例如:大写字母、小写字母、数字)?
您问:
java.util.UUID 会生成特殊字符吗?
不会。UUID 实际上是一个 128 位的值,而不是文本。
UUID 的文本表示法通常是由十六进制数字(0-9,a-f,A-F)和连字符组成的字符串。
你的问题是:
UUID生成的每个字符的类型是什么(例如大写字母、小写字母、数字)。
根据UUID规范的要求,表示UUID值的十六进制字符串中的任何a到f字符必须全部为小写字母。但是违规情况很多。
需要澄清的是,UUID实际上是128位值,不是文本,也不是数字。
你可以将它们视为128位无符号整数。但它们实际上不是数字,因为某些位位置具有语义和特定含义。哪些位具有哪些含义因variant和UUID的version而异。
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规定接受大小写字母。然而,微软、苹果和其他公司通常违反小写规则。曾经有一段时间,微软发布了一个生成混合大小写(同时使用大写和小写)的软件,显然是一个意外的功能。
所以要按照规范进行操作:
UUID
类的toString
方法的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 上查看此 code run live。
当 UUID 尚未知道时,可以使用由所有零组成的特殊 UUID。
00000000-0000-0000-0000-000000000000
您可以通过使用许多生成值的网站之一来查看一些 UUID 值的示例。例如:
或者使用命令行工具。几乎每个操作系统都附带了这样的工具。在macOS上,启动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()
文档中所述。
(文档没有说明十六进制数字是大写还是小写。)