php生成唯一數(shù)字id的方法匯總
關(guān)于生成唯一數(shù)字ID的問(wèn)題,是不是需要使用rand生成一個(gè)隨機(jī)數(shù),然后去數(shù)據(jù)庫(kù)查詢是否有這個(gè)數(shù)呢?感覺(jué)這樣的話有點(diǎn)費(fèi)時(shí)間,有沒(méi)有其他方法呢?
當(dāng)然不是,其實(shí)有兩種方法可以解決。
1. 如果你只用php而不用數(shù)據(jù)庫(kù)的話,那時(shí)間戳+隨機(jī)數(shù)是最好的方法,且不重復(fù);
2. 如果需要使用數(shù)據(jù)庫(kù),即你還需要給這個(gè)id關(guān)聯(lián)一些其他的數(shù)據(jù)。那就給MySQL數(shù)據(jù)庫(kù)中的表的id一個(gè)AUTO_INCREMENT(自增)屬性,每次插入一條數(shù)據(jù)時(shí),id自動(dòng)+1,然后使用mysql_insert_id()或LAST_INSERT_ID()返回這個(gè)自增后的id。
當(dāng)然,這個(gè)問(wèn)題已經(jīng)有現(xiàn)成的解決方法了,使用php uuid擴(kuò)展就能完美解決這個(gè)問(wèn)題,這個(gè)擴(kuò)展能生成唯一的完全數(shù)字簽名。。
如果你不使用composer請(qǐng)參考https://github.com/lootils/uuid,
如果你的項(xiàng)目是基于composer搭建的,那么請(qǐng)參考https://github.com/ramsey/uuid
具體的源碼我就不搬運(yùn)了,小伙伴們自己取下來(lái)就可以直接使用了
PHP生成唯一標(biāo)識(shí)符代碼示例:
< ?
//生成唯一標(biāo)識(shí)符
//sha1()函數(shù), "安全散列算法(SHA1)"
function create_unique() {
$data = $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']
.time() . rand();
return sha1($data);
//return md5(time().$data);
//return $data;
}
?>
PHP生成唯一標(biāo)識(shí)符函數(shù)描述及例子
< ? $newhash = create_unique(); echo $newhash; ?>
再給大家分享一個(gè)
/*
* 信號(hào)量(Semaphore)。
* 這是一個(gè)包裝類,用于解決不同平臺(tái)下對(duì)“信號(hào)量”的不同實(shí)現(xiàn)方式。
* 目前這個(gè)類只是象征性的,在 Windows 平臺(tái)下實(shí)際是空跑(并沒(méi)有真的實(shí)現(xiàn)互斥)。
*/
class SemWrapper
{
private $hasSemSupport;
private $sem;
const SEM_KEY = 1;
public function __construct()
{
$this->hasSemSupport = function_exists( 'sem_get' );
if ( $this->hasSemSupport ) {
$this->sem = sem_get( self::SEM_KEY );
}
}
public function acquire() {
if ( $this->hasSemSupport ) {
return sem_acquire( $this->sem );
}
return true;
}
public function release() {
if ( $this->hasSemSupport ) {
return sem_release( $this->sem );
}
return true;
}
}
/*
* 順序號(hào)發(fā)生器。
*/
class SeqGenerator
{
const SHM_KEY = 1;
/**
* 對(duì)順序號(hào)發(fā)生器進(jìn)行初始化。
* 僅在服務(wù)器啟動(dòng)后的第一次調(diào)用有效,此后再調(diào)用此方法沒(méi)有實(shí)際作用。
* @param int $start 產(chǎn)生順序號(hào)的起始值。
* @return boolean 返回 true 表示成功。
*/
static public function init( $start = 1 )
{
// 通過(guò)信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(nèi)存的訪問(wèn)沖突
$sw = new SemWrapper;
if ( ! $sw->acquire() ) {
return false;
}
// 打開(kāi)共享內(nèi)存
$shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 );
if ( empty($shm_id) ) {
// 因使用了 'n' 模式,如果無(wú)法打開(kāi)共享內(nèi)存,可以認(rèn)為該共享內(nèi)存已經(jīng)創(chuàng)建,無(wú)需再次初始化
$sw->release();
return true;
}
// 在共享內(nèi)存中寫(xiě)入初始值
$size = shmop_write( $shm_id, pack( 'L', $start ), 0 );
if ( $size != 4 ) {
shmop_close( $shm_id );
$sw->release();
return false;
}
// 關(guān)閉共享內(nèi)存,釋放信號(hào)量
shmop_close( $shm_id );
$sw->release();
return true;
}
/**
* 產(chǎn)生下一個(gè)順序號(hào)。
* @return int 產(chǎn)生的順序號(hào)
*/
static public function next()
{
// 通過(guò)信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(nèi)存的訪問(wèn)沖突
$sw = new SemWrapper;
if ( ! $sw->acquire() ) {
return 0;
}
// 打開(kāi)共享內(nèi)存
$shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 );
if ( empty($shm_id) ) {
$sw->release();
return 0;
}
// 從共享內(nèi)存中讀出順序號(hào)
$data = shmop_read( $shm_id, 0, 4 );
if ( empty($data) ) {
$sw->release();
return 0;
}
$arr = unpack( 'L', $data );
$seq = $arr[1];
// 把下一個(gè)順序號(hào)寫(xiě)入共享內(nèi)存
$size = shmop_write( $shm_id, pack( 'L', $seq + 1 ), 0 );
if ( $size != 4 ) {
$sw->release();
return 0;
}
// 關(guān)閉共享內(nèi)存,釋放信號(hào)量
shmop_close( $shm_id );
$sw->release();
return $seq;
}
}
$a = SeqGenerator::init( time() );
var_dump($a);
for ( $i=0; $i < 10; $i++ ) {
$seq = SeqGenerator::next();
var_dump($seq);
}
好了,今天就先到這里吧,希望對(duì)大家學(xué)習(xí)PHP能夠有所幫助
相關(guān)文章
Ubuntu下安裝PHP的mongodb擴(kuò)展操作命令
這篇文章主要介紹了Ubuntu下安裝PHP的mongodb擴(kuò)展操作命令,本文給出下載址以及操作命令,本文使用編譯安裝方式,需要的朋友可以參考下2015-07-07
php json_encode奇怪問(wèn)題說(shuō)明
php json_encode奇怪問(wèn)題說(shuō)明,使用json_encode的朋友可以參考下。2011-09-09
PHP parse_ini_file函數(shù)的應(yīng)用與擴(kuò)展操作示例
這篇文章主要介紹了PHP parse_ini_file函數(shù)的應(yīng)用與擴(kuò)展操作,結(jié)合實(shí)例形式分析了php擴(kuò)展parse_ini_file函數(shù)解析配置文件相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
PHP平滑關(guān)閉/重啟的實(shí)現(xiàn)方法
"平滑重啟"和"快速重啟"是兩種不同的概念,下面這篇文章主要給大家介紹了關(guān)于PHP平滑關(guān)閉/重啟的實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
require(),include(),require_once()和include_once()的異同
require(),include(),require_once()和include_once()的異同...2007-01-01
PHP函數(shù)checkdnsrr用法詳解(Windows平臺(tái)用法)
這篇文章主要介紹了PHP函數(shù)checkdnsrr用法,分析講解了在Windows平臺(tái)使用checkdnsrr函數(shù)的方法,需要的朋友可以參考下2016-03-03
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29
今天在百度知道上面有個(gè)朋友問(wèn)php代碼解密的問(wèn)題,看了代碼不是常見(jiàn)幾種比較感興趣,特意搜索了下,發(fā)現(xiàn)下面的方法,解決了,具體的看最后的說(shuō)明。2011-01-01
php獲取當(dāng)前月與上個(gè)月月初及月末時(shí)間戳的方法
這篇文章主要介紹了php獲取當(dāng)前月與上個(gè)月月初及月末時(shí)間戳的方法,涉及php針對(duì)日期與時(shí)間相關(guān)判斷與操作技巧,需要的朋友可以參考下2016-12-12

