UUID

UUID

UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫,是一種軟體建構的標準,亦為開放軟體基金會組織在分散式計算環境領域的一部分。其目的,是讓分散式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。如此一來,每個人都可以創建不與其它人衝突的UUID。在這樣的情況下,就不需考慮資料庫創建時的名稱重複問題。目前最廣泛套用的UUID,是微軟公司全局唯一標識符GUID),而其他重要的套用,則有Linux ext2/ext3檔案系統、LUKS加密分區、GNOME、KDE、Mac OS X等等。另外我們也可以在e2fsprogs包中的UUID庫找到實現。

基本介紹

  • 中文名:通用唯一識別碼
  • 外文名:Universally Unique Identifier
  • 簡稱:UUID
  • 類別:識別碼
  • 套用分散式計算環境
作用,組成,套用,定義,重複機率,代碼生成,

作用

UUID 的目的是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。在這樣的情況下,就不需考慮資料庫建立時的名稱重複問題。目前最廣泛套用的 UUID,即是微軟的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的套用,則有 Linux ext2/ext3 檔案系統、LUKS 加密分割區、GNOME、KDE、Mac OS X 等等。

組成

UUID是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平台會提供生成的API。按照開放軟體基金會(OSF)制定的標準計算,用到了乙太網卡地址、納秒級時間、晶片ID碼和隨機數。
UUID由以下幾部分的組合:
(1)當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同。
(2)時鐘序列。
(3)全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函式很簡單地生成UUID,其格式為:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個 x 是 0-9 或 a-f 範圍內的一個十六進制的數字。而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以從cflib 下載CreateGUID() UDF進行轉換。

套用

使用UUID的好處在分散式的軟體系統中(比如:DCE/RPC, COM+,CORBA)就能體現出來,它能保證每個節點所生成的標識都不會重複,並且隨著WEB服務等整合技術的發展,UUID的優勢將更加明顯。根據使用的特定機制,UUID不僅需要保證是彼此不相同的,或者最少也是與公元3400年之前其他任何生成的通用唯一標識符有非常大的區別。UUID最少在3000+年內不會重複。
通用唯一標識符還可以用來指向大多數的可能的物體。微軟和其他一些軟體公司都傾向使用全球唯一標識符(GUID),這也是通用唯一標識符的一種類型,可用來指向組建對象模組對象和其他的軟體組件。第一個通用唯一標識符是在網路計算機系統(NCS)中創建,並且隨後成為開放軟體基金會(OSF)的分散式計算環境(DCE)的組件。

定義

UUID是由一組32位數的16進制數字所構成,是故UUID理論上的總數為16^32=2^128,約等於3.4 x 10^38。也就是說若每納秒產生1兆個UUID,要花100億年才會將所有UUID用完。
UUID的標準型式包含32個16進制數字,以連字號分為五段,形式為8-4-4-4-12的32個字元。示例:
  • 550e8400-e29b-41d4-a716-446655440000
UUID亦可刻意重複以表示同類。例如說微軟COM中,所有組件皆必須實現出IUnknown接口,方法是產生一個代表IUnknown的UUID。無論是程式試圖訪問組件中的IUnknown接口,或是實現IUnknown接口的組件,只要IUnknown一被使用,皆會被參考至同一個ID:00000000-0000-0000-C000-000000000046。

重複機率

隨機產生的UUID(例如說由java.util.UUID類別產生的)的128個比特中,有122個比特是隨機產生,4個比特在此版本('Randomly generated UUID')被使用,還有2個在其變體('Leach-Salz')中被使用。利用生日悖論,可計算出兩筆UUID擁有相同值的機率約為:
以下是以x=2^122計算出n筆GUID後產生碰撞的機率:
n機率
68,719,476,736 = 2^36
0.0000000000000004 (4 x 10^-16)
2,199,023,255,552 = 2^41
0.0000000000004 (4 x 10^-13)
70,368,744,177,664 = 2^46
0.0000000004 (4 x 10^-10)
與被隕石擊中的機率比較的話,已知一個人每年被隕石擊中的機率估計為170億分之1,也就是說機率大約是0.00000000006 (6 x 10^-11),等同於在一年內置立數十兆筆GUID並發生一次重複。換句話說,每秒產生10億筆UUID,100年後只產生一次重複的機率是50%。如果地球上每個人都各有6億筆GUID,發生一次重複的機率是50%。
產生重複GUID並造成錯誤的情況非常低,是故大可不必考慮此問題。
機率也與隨機數產生器的質量有關。若要避免重複機率提高,必須要使用基於密碼學上的假隨機數產生器來生成值才行。

代碼生成

Php
function uuid($prefix = ''){    $chars = md5(uniqid(mt_rand(), true));    $uuid  = substr($chars,0,8) . '-';    $uuid .= substr($chars,8,4) . '-';    $uuid .= substr($chars,12,4) . '-';    $uuid .= substr($chars,16,4) . '-';    $uuid .= substr($chars,20,12);    return $prefix . $uuid;}   //Example of using the function -//Using without prefix.echo uuid(); //Returns like ‘1225c695-cfb8-4ebb-aaaa-80da344e8352′ 
C#
using System;namespace Demo{    public class Test{        public static void Main(){            Guid guid=Guid.NewGuid();            Console.WriteLine(guid);        }    }}
C++//基於 boost
#include <boost/uuid/uuid.hpp>#include <boost/uuid/uuid_io.hpp>#include <boost/uuid/uuid_generators.hpp> boost::uuids::uuid zcq_uuid = boost::uuids::random_generator()(); // 這裡是兩個() ,因為這裡是調用的 () 的運算符重載const string dqsj_uuid = boost::uuids::to_string(zcq_uuid);
Java
package com.mytest;import java.util.UUID;public class UTest {    public static void main(String[] args) {        UUID uuid = UUID.randomUUID();        System.out.println(uuid);    }}
Go
package mainimport("github.com/nu7hatch/gouuid"    "fmt")func main(){    fmt.Println(uuid.NewV4())}
python
#coding=utf-8import uuidname = 'test_name'namespace = 'test_namespace'print uuid.uuid1()print uuid.uuid3(namespace,name)print uuid.uuid4()print uuid.uuid5(namespace,name)

相關詞條

熱門詞條

聯絡我們