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