2014年3月6日 星期四

[解釋] uuid 與 guid 的差異

uuid 與 guid 的差異

很多人都有使用過 MySQL 的 number auto increment, 可是實際使用之後就會發現,很快的數字會不夠使用,而且這個 id 是很容易被猜測出來連續性。

因此就開始進行了解,看到了 uuid 這個名詞,進而下去查詢發現 guid 的另外這個名詞,感覺上這兩個名詞似乎是有些什麼特殊關連。

這篇文章就小小記錄一下自己的查詢心得。


guid & uuid


直接到 wiki 上面尋找我們需要的答案,開宗明義就很明確的提到 guid 和 uuid 之間的差異。

A Globally Unique Identifier (GUID, /ˈɡwɪd/or /ˈɡuːɪd/) is a unique reference number used as an identifier in computer software. The term GUID typically refers to various implementations of the universally unique identifier (UUID) standard

在 wiki 上面有提到 guid 是屬於 uuid 的一種變形,主要目的還是用來識別以及作為唯一識別使用。

所以在實作上是包含基本的 uuid 模式,再加上自己獨有的某些使用方法,另外在 wiki 裡面也提到,guid 是微軟所提出的標準,會用於 Windows, ActiveX 等應用中。

uuid


uuid 主要提出的組織為 OSF 開源軟體組織,及 DCE,主要的規範以及實作方式,全部有記錄於 RFC 4122, 如果有興趣的朋友可以自己去查看。

uuid 的應用其實已經很廣泛,目前大家電腦中的 MAC address 就是一個很典型的 uuid 格式,主要型態為,8-4-4-4-12 總字串數為 36 字串長度,前面是採用 16 進位方式產生,最後面兩個串數字為序列式的 byte 字元。

550e8400-e29b-41d4-a716-446655440000

uuid 實作及變形


在 uuid 的規範中,也提出了幾種不同變形,
  • Version 1 (MAC address)
  • Version 2 (DCE Security)
  • Version 3 (MD5 hash)
  • Version 4 (random)
  • Version 5 (SHA-1 hash)
目前許多語言及 OS 都已經有實作這以上幾個類型的方法,也已經應用在大家的基礎運作中。

uuid 的碰撞機率


基本上 uuid 碰撞機率還是有可能會發生,他的機率在 wiki 裡面也有提到,大約比中樂透的機率還低,原文如下,

the annual risk of someone being hit by a meteorite is estimated to be one chance in 17 billion

大概就是每週期的產生會發生碰撞的機率大概是 170 億分之一的機會會發生,因此大家可以安心服用。

使用方法


在不同語言裡面有不同使用方法,以及實作方式,在 node.js 裡面,可以直接採用 node-uuid 這個模組,他也支援前端 pure javascript 直接使用。

使用方法如下,

node.js

var uuid = require('node-uuid');

// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

JavaScript

前端記得要載入 uuid library,

<script src="uuid.js"></script>

程式碼如下,

var uuid = require('node-uuid');

// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

後記


對於一般使用來說 id 的識別其實大家都不會太在意這個部分,剛開始使用也都會直接使用 id, auto increment 作為初始值,可是到了後期,卻會因為這段時間的省功夫,卻帶來許多後遺症。

uuid 的確可以幫忙省下不少功夫,其實 MySQL 裡面也提供了 uuid 的建置, CouchDB 也有採用同樣機制, MongoDB 也採用類似 uuid 的變形,都是屬於可以參考的良好範例。

以上資料參考集結許多網路文章,加上自己的心得,也許某些地方有錯誤,還請大家多多指教討論。

參考連結

沒有留言:

張貼留言

Facebook