UUID生成的字符类型

时间:2011-11-24 14:18:57

标签: java uuid

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

4 个答案:

答案 0 :(得分:37)

UUID≠文字

为了澄清,UUID实际上是 128位值,而不是文本或数字。您可以将它们视为128位无符号整数。

十六进制字符串

人类不能很好地读取和写入128位作为128个10个字符。当需要为人类消费编写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和其他人通常违反小写规则。有一次微软发布了生成混合大小写(使用大写和小写)的软件,这显然是一个非预期的功能。

正如规范所说:

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

UUIDtoString类'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)

根据Internet RFC 4122

  

每个字段均被视为整数,其值打印为   最高有效位的零填充十六进制数字字符串   数字优先。十六进制值“ a”到“ f”的输出为   小写字母,并且在输入时不区分大小写。

如果您遵守互联网标准,请始终使用小写字母。

尽管BNF定义了大写字母,但这是用于输入,而非输出。