1. 程式人生 > >JAVA UUID 生成唯一標識

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