跳到主要內容

[解釋] 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 的變形,都是屬於可以參考的良好範例。

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

參考連結

留言

這個網誌中的熱門文章

[CSS] z-index 在不同瀏覽器繼承問題

今天會討論到這個課題,是因為要實做一個Popup dialog,所以我們希望的結果如下圖。 可是在IE7 卻發生了這樣的情況。 Popup不論怎麼設定z-index都無法浮在最上層,我們看一下html架構發生什麼事情。

[教學] 快快樂樂刪除CodeIgniter index.php

預設的CI網址預設都設定為index.php同一層級,因此所有的程式都必須指定index.php導向才能開始,例如 http://localhost/ci/index.php/welcome/test http://localhost/ci/welcome/test 本文將說明如何將惱人的index.php消除,還你一個漂亮的URL。 設定開始: 接下來說明如何使用rewrite方式將惱人的index.php去除。 rewrite不清楚的人,煩請先自行google 首先要先確定Apache的 mod_rewrite 有 開啟 ,如果沒有開啟請設定好之後重新啟動apache。 接著,在根目錄底下建立一個新檔案,檔名為 .htaccess ,裡面程式碼如下: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] </IfModule> 接著到 application/config/config.php ,開啟檔案修改 $config['index_page'] = ""; 注意: /index.php/$1 要根據你目錄,例如 http://localhost/index.php ,網站根目錄為 /ci/index.php 則要寫成 /ci/index.php/$1 接著至CI目錄下,尋找 config\config.php , 修改一下裡面的檔案,修改如下: $config['index_page'] = ""; 存檔後,如此一來大功告成。 參考資料 官方網站說明

[教學] Mojito 安裝與入門,install mojito for beginner.

mojito ,最近終於從 YDN 對外公開此專案,這個套件主要用於解決前端多重裝置及瀏覽器端的問題,後端服務採取 node.js ,因此使用上必定要先準備以下幾個元素 準備素材 c++ complier git Node.js > 0.4.x NPM > 1.0.x 安裝方式 git clone git://github.com/yahoo/mojito.git cd mojito/source sudo npm install -g . npm install . 以上四個簡單的步驟,就可以把 mojito module 完整安裝到服務器上,接著就可以開始進入 mojito 的世界 使用方式 mojito 提供了完整的 command line 給開發者使用,接著先建立一個基本 hello world 專案,跟著以下步驟完成第一個專案。首先建立一個 mojito application, mojito create app hello cd hello 切換到目錄之後,再接著建立自己的 mojit,這邊的 mojit 就像是一個應用(application)可能會包含許多個獨立網站體,擁有獨立架構的 MVC ,包含內部設定等,詳細資料可以參考官方的 說明 ,建立 mojit mojito create mojit HelloMojit 輸入指令後,會看到顯示結果如下, creating mojit called 'HelloMojit' (using "default" archetype) ✔ mojit: HelloMojit created! ✔ mojito done. 接著修改 application.json 這個 mojit 設定檔案,讓剛才新建立的 hellp application 指定底下有一個 mojit -> HelloMojit ,讓應用可以去執行 mojit controller ,修改如下, [ { "settings": [ "master" ], "appPort": 8666, "specs": { ...