答案 0 :(得分:37)
为了澄清,UUID实际上是 128位值,而不是文本或数字。您可以将它们视为128位无符号整数。
人类不能很好地读取和写入128位作为128个1
和0
个字符。当需要为人类消费编写UUID时,我们使用Hexadecimal(数字0
- 9
和字母a
- f
)字符串。我们使用由4个连字符组成的32个十六进制字符来表示总共36个字符中的128位。例如:
550e8400-e29b-41d4-a716-446655440000
对于问题中提到的“特殊字符”,您只能在UUID的十六进制字符串表示中看到这23个可能的字符:
abcdefABCDEF1234567890 -
2008-08赛季最新的international spec州(强调我的):
6.5.4生成UUID 的十六进制表示的软件不得使用大写字母。 注 - 建议将所有人类可读格式中使用的十六进制表示限制为小写字母。但是,处理此表示的软件需要接受6.5.2中规定的大写和小写字母。
但是,Microsoft,Apple和其他人通常违反小写规则。有一次微软发布了生成混合大小写(使用大写和小写)的软件,这显然是一个非预期的功能。
正如规范所说:
UUID
中toString
类'BNF方法文档的Java文档,在生成字符串时允许使用大写,与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值的一些示例。例如:
或使用命令行工具。几乎每个操作系统都捆绑了这样一个工具。在Mac OS X上,启动Terminal.app并输入uuidgen
。
答案 1 :(得分:8)
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.
所以不,它不会生成特殊字符。
答案 2 :(得分:6)
UUID不包含字符,除非您要求将其转换为字符串。此时,它将变为由十六进制字符和连字符as described by the docs for UUID.toString()
组成的字符串。
(没有记录十六进制数字是大写还是小写。)
答案 3 :(得分:0)
每个字段均被视为整数,其值打印为 最高有效位的零填充十六进制数字字符串 数字优先。十六进制值“ a”到“ f”的输出为 小写字母,并且在输入时不区分大小写。
如果您遵守互联网标准,请始终使用小写字母。
尽管BNF定义了大写字母,但这是用于输入,而非输出。