JAVA UUID 生成惟一標識

Writer:BYSocket(泥沙磚瓦漿木匠)web

Reprint it anywhere u want數據庫

需求

    項目在設計表的時候,要處理併發多的一些數據,相似訂單號不能重複,要保持惟一。本來覺得來個時間戳,精確到毫秒應該不錯了。後來以爲是錯了,測試環境下不少同樣的ID,不能達到惟一標識。併發

UUID

    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要花費更多的空間。獲取的時間倒沒必要考慮太多。

 

獲取八位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

相關文章
相關標籤/搜索