需求
項目在設計表的時候,要處理並發多的一些數據,類似訂單號不能重復,要保持唯一。原本以為來個時間戳,精確到毫秒應該不錯了。後來覺得是錯了,測試環境下很多一樣的ID,不能達到唯一標識。
UUID
JDK API 是這麼說的:“表示通用唯一標識符 (UUID) 的類。 UUID 表示一個 128 位的值。”
詳細的說就是:
“UUID含義是通用唯一識別碼 (Universally Unique Identifier),這 是一個軟件建構的標准,也是被開源軟件基金會 (Open Software Foundation, OSF) 的組織在分布式計算環境 (Distributed Computing Environment, DCE) 領域的一部份。UUID 的目的,是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人沖突的 UUID。在這樣的情況下,就不需考慮數據庫建立時的名稱重復問題。目前最廣泛應用的 UUID,即是微軟的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的應用,則有 Linux ext2/ext3 檔案系統、LUKS 加密分割區、GNOME、KDE、Mac OS X 等等。”
UUID由以下幾部分的組合:
(1)當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其余相同。
(2)時鐘序列
(3)全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
代碼實現
很方便的,直接調用UUID的randomUUID方法,即可獲得UUID對象,然後就獲取了這個唯一標識碼。
public static void main(String[] args)
{
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}
RUN一下,可以從控制台發現:
65752c66-bd3f-4564-b8d6-92d66796e007
這就是唯一標志碼。但顯得冗長,不夠友好。如果在URL後面做參數,更加不夠友好。還有存儲一個UUID要花費更多的空間。獲取的時間倒不必考慮太多。
獲取八位UUID標識碼
仿著網上大牛代碼,直接上代碼:
public static String[] chars = new String[]
{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z"
};
public static String getShortUuid()
{
StringBuffer stringBuffer = new StringBuffer();
String uuid = UUID.randomUUID().toString().replace("-", "");
for (int i = 0; i < 8; i++)
{
String str = uuid.substring(i * 4, i * 4 + 4);
int strInteger = Integer.parseInt(str, 16);
stringBuffer.append(chars[strInteger % 0x3E]);
}
return stringBuffer.toString();
}
用300個測試下,沒問題。足夠用了,能適應環境場景即可。
Java中的UUID http://www.linuxidc.com/Linux/2015-02/113529.htm