php生成唯一uid的解決方法詳解
一、生成唯一uuid
看到某些人會用uuid去代替用戶的uid
從代碼中可以看出,通過unique生成一個以毫秒級時間戳為前綴的字符后md5加密
再通過分隔符進行分割后得到uuid
這種方式雖然極大程度的避免了uid的重復
但是生成的uid太長,足足36個字符,而且是混雜英文和數(shù)字符號的,可讀性很差
而一般的uid中都是純數(shù)值組成的
<?php function generateUUid($strtoupper = false) { $charid = call_user_func($strtoupper ? 'strtoupper' : 'strtolower', md5(uniqid(microtime(true), true))); $hyphen = chr(45); $uuid = substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12); return $uuid; } //結果:37f14a07-cb18-2e54-4e40-da1e2fa0456d
二、生成唯一uid
由于一般正常的uid都是純數(shù)值型的
而要保證唯一性,必然要跟時間戳有關系,因此有了以下代碼
為了盡可能的在同一秒中注冊人數(shù)的uid不同,將時間戳進行打亂隨機排序,也不失為一個好辦法
但是這種缺點就是,uid長度是固定的,無法進行改變,雖然呢,打亂字符是一個很好的解決重復的方式
但是事情無絕對,如果真的因為隨機碰撞導致的uid相同該如何
為了更保險起見,必然還是要走一次數(shù)據(jù)庫的查詢
大大增加了數(shù)據(jù)庫的I/O壓力
<?php function generateUid() { return call_user_func('str_shuffle', time()); } //結果:4067524162
三、生成唯一uid的正確方法
雖然說上面的兩種方式并非不可取
但是在大型公司必然不可取,一種是uid的格式必然純數(shù)值,所以uuid方式可以排除
另外由于對數(shù)據(jù)庫的壓力起見,必然也不會采用第二種方式
而最經(jīng)常采用的方式應該是使用數(shù)據(jù)庫的主鍵索引,因為主鍵索引必然唯一
這里很多人會疑惑,主鍵索引不是會從1開始嗎,這uid會有1位數(shù)的?
小了,格局小了,你可以設置主鍵索引的offset,讓他從100000開始,不就可以解決這個問題了嗎
這時候有人又問,那主鍵索引增加不是有規(guī)律的嗎,比如插一條,會自增1
這時候就可以設置主鍵索引的增長步長,讓他插入一條的步長不為1即可
而為了讓uid看起來更加沒有關聯(lián)性,你可以設置步長為基數(shù),比如3
這樣增長起來,就會是100000,100003,100006,100009,100012....
補充
php中生成標準uuid的方法
UUID是指在一臺機器上生成的數(shù)字,它保證對在同一時空中的所有機器都是唯一的。
通常平臺 會提供生成UUID的API。UUID按照開放軟件基金會(OSF)制定的標準計算,用到了以太網(wǎng)卡地址、納秒級時間、芯片ID碼和許多可能的數(shù)字。
由以 下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之后,過幾秒又生成一個UUID,則第一個部分不同,其余相 同),時鐘序列,全局唯一的IEEE機器識別號(如果有網(wǎng)卡,從網(wǎng)卡獲得,沒有網(wǎng)卡以其他方式獲得),UUID的唯一缺陷在于生成的結果串會比較長。
關于 UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)。
在ColdFusion中可以用CreateUUID()函數(shù)很簡單的生成UUID,其格式為:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每個 x 是 0-9 或 a-f 范圍內(nèi)的一個十六進制的數(shù)字。
而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
<?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(); ?>
到此這篇關于php生成唯一uid的解決方法詳解的文章就介紹到這了,更多相關php內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- PHP利用雪花(SnowFlake)算法生成唯一ID
- 高并發(fā)php uniqid不重復唯一標識符生成方案
- 詳解php中生成標準uuid(guid)的方法
- PHP實現(xiàn)的生成唯一RequestID類完整示例
- php根據(jù)數(shù)據(jù)id自動生成編號的實現(xiàn)方法
- 3種php生成唯一id的方法
- 使用PHP uniqid函數(shù)生成唯一ID
- php中session_id()函數(shù)詳細介紹,會話id生成過程及session id長度
- php GUID生成函數(shù)和類
- php 生成唯一id的幾種解決方法
- php根據(jù)id生成10位不重復數(shù)字跟字母混合字符串
相關文章
Yii2中的場景(scenario)和驗證規(guī)則(rule)詳解
Yii2的rule用于對模型屬性進行驗證,scenario用戶定義不同場景下需要驗證的模型,下面這篇文章主要給大家介紹了關于Yii2中場景(scenario)和驗證規(guī)則(rule)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2018-01-01tp5.1 框架數(shù)據(jù)庫常見操作詳解【添加、刪除、更新、查詢】
這篇文章主要介紹了tp5.1 框架數(shù)據(jù)庫常見操作,結合實例形式詳細分析了thinkPHP5.1針對數(shù)據(jù)庫的添加、刪除、更新、查詢相關操作技巧與使用注意事項,需要的朋友可以參考下2020-05-05