1. 程式人生 > >各種OS中生成UUID的方法

各種OS中生成UUID的方法

開發人員或多或少都應該知道UUID或GUID,這是摘自維基百科的一段描述。

通用唯一識別碼 (Universally Unique Identifier, UUID) 是一個軟體建構的標準,亦為自由軟體基金會 (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 等等。另外我們也可以在 e2fsprogs 套件中的 UUID 函式庫找到實作。

因參與的一個專案需要在不同系統及開發環境中生成UUID,故對UUID的生成進行了一些學習,整理如下。

Shell

幾乎所有Unix和類Unix環境中都包含了一個名為uuidgen的小工具,執行即可生成一個UUID。

Linux/Mac OS X

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <uuid/uuid.h>
int main(int argc, char **argv)
{
    uuid_t uuid;
    uuid_generate(uuid);
unsigned char *p = uuid; int i; for (i = 0; i < sizeof(uuid_t); i++, p++) { printf("%02x", *p); } printf("\n"); return 0; }

在Linux下編譯時需要連結uuid庫(-luuid),在Mac OS X下則不需要。

HP-UX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <dce/uuid.h>
int main(int argc, char **argv) { uuid_t uuid; unsigned32 ret; uuid_create(&uuid, &ret); if (ret != uuid_s_ok) return -1; unsigned char *p = (unsigned char *)&uuid; int i; for (i = 0; i < sizeof(uuid_t); i++) { printf("%02x", *p++); } printf("\n"); return 0; }

雖然都命名為uuid_t,但HP-UX與Linux的uuid_t的定義形式不同,前者是由long/short/char等組成的structure,後者則是單純的char陣列(兩者本質上等價,只是表示形式不同),所以uuid_create與uuid_generate引數中的uuid_t形式也不同。

注意,uuid.h標頭檔案位於/opt/dce/include目錄下,且需要連結dcekt庫(-ldcekt)。

Mac OS X (Cocoa)

進行Cocoa開發時,使用CFUUIDCreate函式可生成UUID,以下程式碼摘自Vincent Gable’s Blog

1
2
3
4
5
6
7
8
+ (NSString*) stringWithUUID
{
    CFUUIDRef uuidObj = CFUUIDCreate(nil);//create a new UUID
    //get the string representation of the UUID
    NSString *uuidString = (NSString*)CFUUIDCreateString(nil, uuidObj);
    CFRelease(uuidObj);
    return [uuidString autorelease];
}

Windows

使用API函式HRESULT CoCreateGuid(__out GUID *pguid)可生成GUID(即UUID),其中GUID型別的定義類似於HP-UX,將上文HP-UX的示範程式碼稍作修改即可移植到Windows平臺。由於CoCreateGuid是COM函式,別忘了首先呼叫CoInitializeEx進行初始化。

Java

JDK 1.5以上內建了UUID的支援,使用非常簡單。

1
2
3
4
5
import java.util.UUID;
...
String uuid = UUID.randomUUID().toString();