GUID
GUID (Globally Unique Identifier) 是由微軟所提出實現UUID的一種作法, 早期包含了MAC地址、硬體序號、網卡相關參數,當地時間等,來建立起的唯一字串, 但是因為會有暴露MAC的安全疑慮,因此, 後來衍伸的版本則有陸續做不同的調整, 總而言之,目的都是用來建議唯一辨識字碼, 普遍來說,GUID 字串長度為 32個16進位(0-9,A-F),如:{12AB3456-7AAAA-1010-A2EE-12345B67899D} (本質是屬於128位元的二進位整數)。
在PHP5.0 ~ 5.4.4 的版本,windows都可以直接透過 com_create_guid() 來取得GUID, 但是在Linux以及5.4.5之後的版本則預設不支援 com_create_guid(), 會發生錯誤訊息:
Fatal error: Uncaught Error: Call to undefined function com_create_guid() ...
(windows 環境中,php5.4.5以上版本需添加com拓展才能使用) 雖然不一定能使用com_create_guid(),還是可以自行生成GUID 當系統不支援com_create_guid() 就能透過自行生成的方式取代,
網路上已有人提供產生guid的寫法,如下:
GUID
<?php
function guid(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"
$uuid = chr(123)// "{"
.substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"
return $uuid;
}
}
echo guid();
//hex with dashes, it'll be varchar(36)
//Output ex: {80D19B96-E973-67BA-D2C0-F0EA4BD40F1E}
?>
在實際應用時,不會使用到 - 以及前後括弧,可調整如下:
<?php
function guid(){
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$uuid = substr($charid, 0, 8)
.substr($charid, 8, 4)
.substr($charid,12, 4)
.substr($charid,16, 4)
.substr($charid,20,12);
return $uuid;
}
echo guid();
//If it's hex without dashes, it'll be varchar(32)
//Output ex: 90947CC8C5750A7E239142B80343E399
?>
備註
GUID 雖然可以保證是唯一的,但不要把它用在生成隨機數 GUID至少有六個位被保留並具有特殊含義 GUID 通常要能夠進行排序(按順序生成) 截至目前在統計學上指出,GUID不大可能發生衝突 可以使用各種演算法生成GUID,所以在未來會陸續有不同的演算法實現GUID 在規劃schema時,還是建議能多保留一些長度,長度仍可能會超過 128-bits
Laravel GUID Generator
如果有使用Laravel,可以直接參考這裡 https://github.com/sudiptpa/guid
UUID
通用唯一識別碼(英語:Universally Unique Identifier,簡稱UUID) 是為了讓每個人都能建立不跟其他人重複的唯一碼, (若每奈秒產生1兆個UUID,要花100億年才會將所有UUID用完)
Pure PHP UUID generator https://gist.github.com/dahnielson/508447
也可以直接透過MySQL來生成
--生成正式的UUID格式
SELECT UUID();
--MySQL 5.1 之後版本,可透過UUID_SHORT 生成64位無符號整數
SELECT UUID_SHORT();