各种OS中生成UUID的方法

感谢原创作者,原文网址是:http://linfan.info/blog/2012/04/20/uuid/


各种OS中生成UUID的方法

Apr 20th, 2012

开发人员或多或少都应该知道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(); 

Apr 20th, 2012 Cocoa, Linux, Mac OS X, Windows

你可能感兴趣的:(各种OS中生成UUID的方法)