php生成唯一uid的解決方法詳解
一、生成唯一uuid
看到某些人會(huì)用uuid去代替用戶的uid
從代碼中可以看出,通過(guò)unique生成一個(gè)以毫秒級(jí)時(shí)間戳為前綴的字符后md5加密
再通過(guò)分隔符進(jìn)行分割后得到uuid
這種方式雖然極大程度的避免了uid的重復(fù)
但是生成的uid太長(zhǎng),足足36個(gè)字符,而且是混雜英文和數(shù)字符號(hào)的,可讀性很差
而一般的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;
}
//結(jié)果:37f14a07-cb18-2e54-4e40-da1e2fa0456d
二、生成唯一uid
由于一般正常的uid都是純數(shù)值型的
而要保證唯一性,必然要跟時(shí)間戳有關(guān)系,因此有了以下代碼
為了盡可能的在同一秒中注冊(cè)人數(shù)的uid不同,將時(shí)間戳進(jìn)行打亂隨機(jī)排序,也不失為一個(gè)好辦法
但是這種缺點(diǎn)就是,uid長(zhǎng)度是固定的,無(wú)法進(jìn)行改變,雖然呢,打亂字符是一個(gè)很好的解決重復(fù)的方式
但是事情無(wú)絕對(duì),如果真的因?yàn)殡S機(jī)碰撞導(dǎo)致的uid相同該如何
為了更保險(xiǎn)起見,必然還是要走一次數(shù)據(jù)庫(kù)的查詢
大大增加了數(shù)據(jù)庫(kù)的I/O壓力
<?php
function generateUid()
{
return call_user_func('str_shuffle', time());
}
//結(jié)果:4067524162
三、生成唯一uid的正確方法
雖然說(shuō)上面的兩種方式并非不可取
但是在大型公司必然不可取,一種是uid的格式必然純數(shù)值,所以u(píng)uid方式可以排除
另外由于對(duì)數(shù)據(jù)庫(kù)的壓力起見,必然也不會(huì)采用第二種方式
而最經(jīng)常采用的方式應(yīng)該是使用數(shù)據(jù)庫(kù)的主鍵索引,因?yàn)橹麈I索引必然唯一
這里很多人會(huì)疑惑,主鍵索引不是會(huì)從1開始嗎,這uid會(huì)有1位數(shù)的?
小了,格局小了,你可以設(shè)置主鍵索引的offset,讓他從100000開始,不就可以解決這個(gè)問(wèn)題了嗎
這時(shí)候有人又問(wèn),那主鍵索引增加不是有規(guī)律的嗎,比如插一條,會(huì)自增1
這時(shí)候就可以設(shè)置主鍵索引的增長(zhǎng)步長(zhǎng),讓他插入一條的步長(zhǎng)不為1即可
而為了讓uid看起來(lái)更加沒(méi)有關(guān)聯(lián)性,你可以設(shè)置步長(zhǎng)為基數(shù),比如3
這樣增長(zhǎng)起來(lái),就會(huì)是100000,100003,100006,100009,100012....

補(bǔ)充
php中生成標(biāo)準(zhǔn)uuid的方法
UUID是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。
通常平臺(tái) 會(huì)提供生成UUID的API。UUID按照開放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字。
由以 下幾部分的組合:當(dāng)前日期和時(shí)間(UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,過(guò)幾秒又生成一個(gè)UUID,則第一個(gè)部分不同,其余相 同),時(shí)鐘序列,全局唯一的IEEE機(jī)器識(shí)別號(hào)(如果有網(wǎng)卡,從網(wǎng)卡獲得,沒(méi)有網(wǎng)卡以其他方式獲得),UUID的唯一缺陷在于生成的結(jié)果串會(huì)比較長(zhǎng)。
關(guān)于 UUID這個(gè)標(biāo)準(zhǔn)使用最普遍的是微軟的GUID(Globals Unique Identifiers)。
在ColdFusion中可以用CreateUUID()函數(shù)很簡(jiǎn)單的生成UUID,其格式為:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每個(gè) x 是 0-9 或 a-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。
而標(biāo)準(zhǔn)的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();
?>
到此這篇關(guān)于php生成唯一uid的解決方法詳解的文章就介紹到這了,更多相關(guān)php內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PHP利用雪花(SnowFlake)算法生成唯一ID
- 高并發(fā)php uniqid不重復(fù)唯一標(biāo)識(shí)符生成方案
- 詳解php中生成標(biāo)準(zhǔn)uuid(guid)的方法
- PHP實(shí)現(xiàn)的生成唯一RequestID類完整示例
- php根據(jù)數(shù)據(jù)id自動(dòng)生成編號(hào)的實(shí)現(xiàn)方法
- 3種php生成唯一id的方法
- 使用PHP uniqid函數(shù)生成唯一ID
- php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度
- php GUID生成函數(shù)和類
- php 生成唯一id的幾種解決方法
- php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串
相關(guān)文章
Laravel5.1 框架模型創(chuàng)建與使用方法實(shí)例分析
這篇文章主要介紹了Laravel5.1 框架模型創(chuàng)建與使用方法,結(jié)合實(shí)例形式分析了laravel5.1框架模型的原理、創(chuàng)建、更新、獲取等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
php結(jié)合正則批量抓取網(wǎng)頁(yè)中郵箱地址
目前在做一個(gè)項(xiàng)目,需要提取一個(gè)小型網(wǎng)站的所有郵箱地址,度娘了一下,方法還挺多,這里給大家總結(jié)幾個(gè)比較實(shí)用的,分享給大家。2015-05-05
在IIS7.0下面配置PHP 5.3.2運(yùn)行環(huán)境的方法
最近心血來(lái)潮,想學(xué)習(xí)一下php,既然想學(xué)習(xí)了就得需要搭環(huán)境。在網(wǎng)上找來(lái)找去都是說(shuō)IIS5.0或者6.0的配置。真是看得云里霧里的,這樣直接影響了我的判斷力。現(xiàn)特意寫下來(lái)在IIS7.0下面如何進(jìn)行配置PHP。2010-04-04
Zend Framework生成驗(yàn)證碼并實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能(附demo源碼下載)
這篇文章主要介紹了Zend Framework生成驗(yàn)證碼并實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能,較為詳細(xì)的分析講述了Zend Framework實(shí)現(xiàn)操作驗(yàn)證碼操作的具體步驟與相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-03-03
phpfans留言版用到的數(shù)據(jù)操作類和分頁(yè)類
phpfans留言版用到的數(shù)據(jù)操作類和分頁(yè)類...2007-01-01

