簡體   English   中英

UUID 生成的字符類型

[英]Type of Character generated by UUID

  1. java.util.UUID 會生成特殊字符嗎?
  2. UUID 生成的每個字符的類型是什么(例如大寫、小寫、數字)。

tl;博士

你問:

java.util.UUID 會生成特殊字符嗎?

不。UUID實際上是一個 128 位的值,而不是文本。

UUID 的文本表示規范地是一串十六進制數字(0-9、af、AF)加上連字符。


你問:

UUID 生成的每個字符的類型是什么(例如大寫、小寫、數字)。

根據 UUID 規范的要求,表示 UUID 值的十六進制字符串中的任何 a-to-f 字符必須全部為小寫 但違規行為比比皆是。

UUID ≠ 文本

澄清一下, UUID實際上是一個 128 位的值,不是文本,也不是數字。

您可以將它們視為 128 位無符號整數。 但它們實際上並不是數字,因為某些位位置具有語義、特定含義。 哪些位具有哪些含義因 UUID 的變體版本而異。

十六進制字符串

人類不能很好地將 128 位讀寫為 128 個10字符。 當需要編寫 UUID 供人類使用時,我們使用 base-16十六進制(數字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 中規定的大小寫字母。

常見違規行為

但是,Microsoft、Apple 和其他公司通常會違反小寫規則。 有一次,Microsoft 發布了生成混合大小寫(使用大寫和小寫)的軟件,這顯然是一個意外的功能。

所以按照規范說:

  • 輸出時使用小寫。
  • 允許輸入小寫或大寫。

UUID類的toString方法的 Java 文檔在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 中實時運行

零值

當 UUID 未知時,您可以使用由全零組成的特殊 UUID。

00000000-0000-0000-0000-000000000000

示例值

您可以使用許多生成值的網站中的任何一個來查看 UUID 值的一些示例。 例如:

或者使用命令行工具。 幾乎每個操作系統都捆綁了這樣的工具。 在 Mac OS X 上,啟動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()的文檔所述

(沒有記錄十六進制數字是大寫還是小寫。)

根據Internet RFC 4122

每個字段都被視為一個整數,並將其值打印為一個以零填充的十六進制數字字符串,最高有效數字在前。 十六進制值“a”到“f”作為小寫字符輸出,輸入時不區分大小寫。

如果您尊重互聯網標准,請始終使用小寫字母。

雖然 BNF 定義了大寫字母,但它是用於輸入的,而不是用於輸出的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM