php產生UUID唯一序列的程式碼範例

來源:互聯網
上載者:User

 

/**  * 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
是否能更改為整型做主鍵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.