天天看點

uuid 生成方法UUID生成方法總結

轉載自:http://www.360doc.com/content/14/0109/12/9297708_343818753.shtml

UUID生成方法總結

轉自:http://puxx.blog.ustc.edu.cn/index.php/2013/06/28/uuid%E7%94%9F%E6%88%90%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/

UID簡介

摘自維基百科

通用唯一識别碼(英語:Universally Unique Identifier,簡稱UUID)是一種軟體建構的标準,亦為自由軟體基金會組織在分散式計算環境領域的一部份。

UUID的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要通過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人沖突的UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重複問題。目前最廣泛應用的UUID,是微軟公司的全局唯一辨別符(GUID),而其他重要的應用,則有Linux ext2/ext3檔案系統、LUKS加密分區、GNOME、KDE、Mac OS X等等。另外我們也可以在e2fsprogs包中的UUID庫找到實作。

生成方法

搜集了一些UUID的生成方法,整理如下

Shell

  • Unix/Linux環境中大都有一個名為uuidgen的小工具,運作即可生成一個UUID到标準輸出
  • 讀取檔案

    /proc/sys/kernel/random/uuid

    即得UUID,例如:
    cat /proc/sys/kernel/random/uuid
               

libuuid

libuuid是一個用于生成UUID的C庫,具體用法參考http://linux.die.net/man/3/libuuid,示例如下:

#include <stdio.h>
#include <uuid/uuid.h>

int main(int argc, char **argv)
{
    uuid_t uuid;
    char str[36];

    uuid_generate(uuid);
    uuid_unparse(uuid, str);

    printf("%s\n", str);

    return 0;
}
           

在Linux下編譯時需要連結uuid庫

gcc -o uuid uuid.c -luuid
           

在Ubuntu中,可以用下面的指令安裝libuuid:

sudo apt-get install uuid-dev
           

boost uuid

Boost庫是一個可移植的開源C++庫,它提供了UUID的實作。

下面的代碼可以生成一個UUID

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>

boost::uuids::uuid a_uuid = boost::uuids::random_generator();
           

Qt QUuid

Qt是一個跨平台的C++程式設計架構,QUuid類實作了UUID的生成、比較、轉換等功能。

函數

QUuid createUuid();

可用于生成一個随即UUID。示例如下:

#include <iostream>
#include <QUuid>
#include <QString>

int main()
{
    QUuid uuid = QUuid::createUuid();
    std::cout << qPrintable(uuid.toString()) << std::endl;
    return 0;
}
           

CoCreateGuid

Windows下提供了函數CoCreateGuid用于生成GUID。需要使用的頭檔案是”objbase.h”,需要連結的庫是ole32.lib,函數原型為:

HRESULT CoCreateGuid(GUID *pguid);
           

GUID的原型為

typedef struct _GUID
{
    DWORD Data1;
    WORD Data2;
    WORD Data3;
    BYTE Data4[8];
} GUID;
           

Java

JDK 1.5以上支援UUID,用法如下:

import java.util.UUID;
String uuid = UUID.randomUUID().toString();