Writer:BYSocket(泥沙磚瓦漿木匠)web
Reprint it anywhere u want數據庫
項目在設計表的時候,要處理併發多的一些數據,相似訂單號不能重複,要保持惟一。本來覺得來個時間戳,精確到毫秒應該不錯了。後來以爲是錯了,測試環境下不少同樣的ID,不能達到惟一標識。併發
JDK API 是這麼說的:
「表示通用惟一標識符 (UUID) 的類。 UUID 表示一個 128 位的值。」app
詳細的說就是:
「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 等等。」dom
UUID由如下幾部分的組合: socket
(1)當前日期和時間,UUID的第一個部分與時間有關,若是你在生成一個UUID以後,過幾秒又生成一個UUID,則第一個部分不一樣,其他相同。 分佈式
(2)時鐘序列 測試
(3)全局惟一的IEEE機器識別號,若是有網卡,從網卡MAC地址得到,沒有網卡以其餘方式得到。ui
很方便的,直接調用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要花費更多的空間。獲取的時間倒沒必要考慮太多。
仿着網上大牛代碼,直接上代碼:
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