/** * Generates an UUID * * @author Anis uddin Ahmad * @param string an optional prefix * @return string the formatted uuid */ 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′ //Using with prefixecho uuid(‘urn:uuid:’);//Returns like ‘urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344e8352′
*************************************************************************************
也可以直接用sql語句產生如:
直接在insert語句中插入UUID作主鍵的用法(簡便):
insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);
************************************************************************************
php產生uuid 來表示唯一碼
uuid是什嗎?guid是什嗎?php如何產生uuid?(google 搜尋相關內容時使用uuid + mysql得到的結果較uuid+php要多些)
這裡有一篇關於UUID的說明 蠻詳細
http://mlxia.javaeye.com/blog/279059
以下部分內容為轉載:
我唯一還算熟悉的資料庫就 算是MySQL了,大概使用MySQL的人,百分之九九以上的人會使用Autoincrement ID做主鍵,這是可以理解的,因為MySQL的自增ID效率很高,使用也很方便。那麼剩下的百分之一的人使用什麼做主鍵呢?可能是自己做的 KeyGenerator,也可能是我們下面要說的UUID。
據說在Oracle的圈子裡,如果誰用自增ID做主鍵是要被鄙視的,主鍵最自然的選擇就是UUID。我不瞭解Oracle,這些道聽途說的結論是否正確不做承諾。
那麼我們先看看什麼是UUID?簡單的說,UUID是指在一台機器上產生的數字,它保證對在同一時空中的所有機器都是唯一的。在UUID的演算法中,可能會用到諸如網卡MAC地址,IP,主機名稱,進程ID等資訊以保證其獨立性。
如果你的MySQL版本不太老的話,鍵入 SELECT UUID(); 輸出的就是UUID,如下:
mysql> select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
現在大家應該對UUID有一個比較直觀的認識了,我們來看看UUID的優缺點分別是什麼。
優點:
能夠保證獨立性,程式可以在不同的資料庫間遷移,效果不受影響。
保證產生的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分資料庫的時候尤為重要。
缺點:
比較佔地方,和INT類型相比,儲存一個UUID要花費更多的空間。
使用UUID後,URL顯得冗長,不夠友好。
下面針對上述UUID的缺點說說我的看法,比較佔地方這個缺點我不是很在乎,現在最不值錢的就是硬碟了,略過此條缺點無妨。至於說使用UUID後,URL 顯得不友好,我覺得這多少是你的INT情結造成的慣性思維,其實,和INT類型相比,UUID才是最自然的主鍵選擇,注意,我這裡用的是自然這個形容詞, 仔細體會一下你能理解我的意思。另外,很多時候,URL本身就不需要友好,比如,一個電子商務網站,按照INT友好的URL說法,她的訂單URL大概是下 面這個形式的:/order.php/id/123,我要說明的是,這樣是很友好,但是有些太友好了,友好的甚至不安全,比如說,我早晨下一個訂單,發現
URL是/order.php/id/1000,晚上再下一個訂單發現URL是/order.php/id/2000,那麼我就可以估計出此網站一天的訂 單數大致是1000左右,甚至能大體估計出它的銷售額,而這些資料往往都是重要的商業秘密。使用UUID就沒有這個顧慮。
效率?
如果上面說的UUID的所謂缺點都不成立的話,那麼是否使用UUID做主鍵,唯一的問題就是效率了。據說在PostgreSQL等資料庫裡,都有專門的 UUID類型,在這樣的資料庫裡,使用UUID做主鍵,效率沒有任何問題,可惜在MySQL裡沒有這樣的欄位,如果想在MySQL裡儲存UUID做主鍵, 一般是使用CHAR(36)來類比,因為不是一個原生的UUID類型,所以主鍵的效率到底如何有待測試,另外,UUID做主鍵的效率和UUID本身的演算法 實現也有很大關係。
我本來想在我自己的電腦上插入1000000條資料測試一下看看來著,可惜一測試,硬碟燈就一直亮,讓我很擔心它會掛,雖然硬碟不值錢,但是我重要的資料都在上面,一旦壞了,損失就大了,所以,測試只好作罷。
至於在MySQL上使用UUID(用char(36)儲存)做主鍵,效率到底如何,我也不知道,抱歉 -_-!!!
如何產生UUID?下面這種方法產生的貌似不是UUID,因為MD5實際上是可能存在重複值的(參考http://www.phpx.com/happy/archiver/tid-56636.html),況且使用隨機更不能避免存在重複.所以應直接使用mysql中的uuid函數產生
de> 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;
} de>
在mysql中插入uuid使用mysql的uuid()函數
INSERT INTO Table(id,..) VALUES( UUID(), ...)
當然也可以用 SELECT UUID() 先得到一個uuid值再插入進去
題外:
可能相比較使用整型做主鍵,效率稍差,
另外一個問題是可能導致URL太長,比如顯示某個id下的分類時
通常這樣category.php?cid=2 但是現在可能是category.php?uuid=a93f16c5-9634-102c-824f-3ea0651c5b77
是否能更改為整型做主鍵