從 Java 中的字符串生成相同的 UUID
一、概述
我們經常需要在我們的應用程序中為各種目的生成唯一標識符。一種常用的生成唯一標識符的方法是通用唯一標識符 (UUID)。
在本教程中,我們將探索如何從 Java 中的字符串生成相同的 UUID。
二、問題簡介
當我們談論從字符串生成 UUID 時,可能有兩種情況:
- 場景 1 – 輸入字符串採用標準 UUID 字符串格式。
- 場景 2 – 給定的字符串是自由格式的字符串。
接下來,我們將仔細研究如何從字符串生成UUID
對象。當然,我們將涵蓋這兩種情況。
為簡單起見,我們將使用單元測試斷言來驗證每種方法是否可以產生預期的結果。
3.給定的字符串是一個標準的UUID表示
標準的 UUID 字符串格式由五組由連字符分隔的十六進制數字組成,例如:
String inputStr = "bbcc4621-d88f-4a94-ae2f-b38072bf5087";
在這種情況下,我們希望從給定的字符串中獲取一個UUID
對象。此外,生成的UUID
對象的字符串表示必須等於輸入字符串。換句話說,這意味著generatedUUID.toString()
與輸入字符串相同。
所以,準確地說,我們想要“解析”標準 UUID 格式的輸入字符串,並根據解析值構造一個新的UUID
對象。
為此,我們可以使用UUID.fromString()
方法。接下來,讓我們編寫一個測試,看看它是如何工作的:
String inputStr = "bbcc4621-d88f-4a94-ae2f-b38072bf5087";
UUID uuid = UUID.fromString(inputStr);
UUID uuid2 = UUID.fromString(inputStr);
UUID uuid3 = UUID.fromString(inputStr);
assertEquals(inputStr, uuid.toString());
assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);
如上面的測試所示,我們只是調用UUID.fromString(inputStr)
來生成UUID
對象。標準UUID
類負責輸入解析和 UUID 生成。
此外,在我們的測試中,我們從同一個輸入字符串生成了多個UUID
對象,事實證明輸入字符串生成的所有UUID
對像都是相等的。
使用UUID.fromString()
方法很方便。但是,值得一提的是,輸入的字符串必須是標準的 UUID 格式。否則,該方法將拋出IllegalArgumentException
:
String inputStr = "I am not a standard UUID representation.";
assertThrows(IllegalArgumentException.class, () -> UUID.fromString(inputStr));
4.給定的輸入是一個自由格式的字符串
我們已經看到UUID.fromString()
可以方便地從標準 UUID 格式字符串構造UUID
對象。讓我們看看如何從自由格式字符串生成UUID
對象。
UUID
類為我們提供了nameUUIDFromBytes(byte[] name)
方法來構造版本 3(也稱為基於名稱的) UUID
對象。
由於該方法只接受字節數組 ( byte[]
),我們需要將輸入字符串轉換為字節數組才能使用UUID.nameUUIDFromBytes()
:
String inputStr = "I am not a standard UUID representation.";
UUID uuid = UUID.nameUUIDFromBytes(inputStr.getBytes());
UUID uuid2 = UUID.nameUUIDFromBytes(inputStr.getBytes());
UUID uuid3 = UUID.nameUUIDFromBytes(inputStr.getBytes());
assertTrue(uuid != null);
assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);
正如我們在上面的測試中看到的,我們通過使用相同的輸入字符串三次調用UUID.nameUUIDFromBytes()
生成了三個UUID
對象,並且這三個UUIDs
彼此相等。
在內部,此方法基於輸入字節數組的 MD5 哈希值返回一個UUID
對象。因此,生成的 UUID 保證對於給定的輸入名稱是唯一的。
此外,值得一提的是,由UUID.nameUUIDFromBytes()
方法生成的UUID
對像是版本 3 UUID 。我們可以使用version()
方法來驗證它:
UUID uuid = UUID.nameUUIDFromBytes(inputStr.getBytes());
...
assertEquals(3, uuid.version());
版本 5 UUID 使用 SHA-1(160 位)散列函數而不是 MD5。如果需要版本 5 UUID
,我們可以直接使用我們在引入版本 3 和版本 5 UUID 時創建的generateType5UUID(String
name) 方法:
String inputStr = "I am not a standard UUID representation.";
UUID uuid = UUIDGenerator.generateType5UUID(inputStr);
UUID uuid2 = UUIDGenerator.generateType5UUID(inputStr);
UUID uuid3 = UUIDGenerator.generateType5UUID(inputStr);
assertEquals(5, uuid.version());
assertTrue(uuid != null);
assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);
5.結論
在本文中,我們探討瞭如何從字符串生成相同的UUID
對象。根據輸入格式,我們介紹了兩種情況:
- 標準 UUID 格式字符串——使用
UUID.fromString()
- 自由格式字符串——使用
UUID.nameUUIDFromBytes()
與往常一樣,此處提供的所有代碼片段都可以在 GitHub 上找到。