UUID生成的字符类型

min*_*nil 24 java uuid

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

Bas*_*que 46

UUID≠文字

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

十六进制字符

人类不能很好地读取和写入128位作为128 10字符.当需要为人类消费编写UUID时,我们使用十六进制(数字0- 9和字母a- f)字符串.我们使用由4个连字符组成的32个十六进制字符来表示总共36个字符中的128位.例如:

550e8400-e29b-41d4-a716-446655440000

没有"特殊"字符

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

abcdefABCDEF1234567890-

规格要求小写

2008 - 08年的最新国际规范(强调我的):

6.5.4生成UUID十六进制表示的软件不得使用大写字母.注 - 建议将所有人类可读格式中使用的十六进制表示限制为小写字母.但是,处理此表示的软件需要接受6.5.2中规定的大写和小写字母.

违规常见

但是,Microsoft,Apple和其他人通常违反小写规则.有一次微软发布了生成混合大小写的软件(使用大写和小写),这显然是一个非预期的功能.

规范如此说:

  • 使用小写输出.
  • 容忍输入的小写或大写.

BNFUUID类' toString方法文档的Java文档在生成字符串时允许使用大写,与UUID标准规范相矛盾.但是,在Java 8 的Oracle实现中,类及其方法的实际行为是正确的,使用小写输出但是容许输入的大写或小写.toString

以小写/大写输入:

UUID uuidFromLowercase = UUID.fromString ( "897b7f44-1f31-4c95-80cb-bbb43e4dcf05" ); 
UUID uuidFromUppercase = UUID.fromString ( "897B7F44-1F31-4C95-80CB-BBB43E4DCF05" );
Run Code Online (Sandbox Code Playgroud)

仅输出为小写:

System.out.println ( "uuidFromLowercase.toString(): " + uuidFromLowercase );
System.out.println ( "uuidFromUppercase.toString(): " + uuidFromUppercase );
Run Code Online (Sandbox Code Playgroud)

uuidFromLowercase.toString():897b7f44-1f31-4c95-80cb-bbb43e4dcf05

uuidFromUppercase.toString():897b7f44-1f31-4c95-80cb-bbb43e4dcf05

请参阅此代码在IdeOne.com中运行.

零值

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

00000000-0000-0000-0000-000000000000

示例值

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

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


sud*_*ode 8

适用于Javadoc java.util.UUID中的链接,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.
Run Code Online (Sandbox Code Playgroud)

所以不,它不会生成特殊字符.


Jon*_*eet 6

UUID不包含字符,除非您要求将其转换为字符串.此时,它将变为由十六进制字符和连字符组成的字符串,如文档所述UUID.toString().

(没有记录十六进制数字是大写还是小写.)