JAVA UUID 生成唯一標識
Writer:BYSocket(泥沙磚瓦漿木匠)
Reprint it anywhere u want
需求
專案在設計表的時候,要處理併發多的一些資料,類似訂單號不能重複,要保持唯一。原本以為來個時間戳,精確到毫秒應該不錯了。後來覺得是錯了,測試環境下很多一樣的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物件,然後就獲取了這個唯一標識碼。
?1 2 3 4 5 |
public
static void main(String[] args)
{
UUID
uuid = UUID.randomUUID(); System.out.println(uuid);
}
|
RUN一下,可以從控制檯發現:
?1 |
< font
size = "4" >
65752c66-bd3f-4564-b8d6-92d66796e007</ font >
|
這就是唯一標誌碼。但顯得冗長,不夠友好。如果在URL後面做引數,更加不夠友好。還有儲存一個UUID要花費更多的空間。獲取的時間倒不必考慮太多。
獲取八位UUID標識碼
仿著網上大牛程式碼,直接上程式碼:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
< font
size = "4" >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();
}
</font>
|
用300個測試下,沒問題。足夠用了,能適應環境場景即可。
Writer:BYSocket(泥沙磚瓦漿木匠)
Reprint it anywhere u want