欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php生成唯一數(shù)字id的方法匯總

 更新時(shí)間:2015年11月18日 10:40:42   投稿:hebedich  
我們?cè)谄綍r(shí)的項(xiàng)目中,經(jīng)常會(huì)遇到要使用php生成唯一數(shù)字id的環(huán)境,網(wǎng)上查了很多資料,其實(shí)還是有一定的可能性重復(fù)的,所以今天在這里分享下,個(gè)人最近研究這個(gè)問題的所得。

關(guān)于生成唯一數(shù)字ID的問題,是不是需要使用rand生成一個(gè)隨機(jī)數(shù),然后去數(shù)據(jù)庫(kù)查詢是否有這個(gè)數(shù)呢?感覺這樣的話有點(diǎn)費(fèi)時(shí)間,有沒有其他方法呢?

當(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è)問題已經(jīng)有現(xiàn)成的解決方法了,使用php uuid擴(kuò)展就能完美解決這個(gè)問題,這個(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í)際是空跑(并沒有真的實(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)用此方法沒有實(shí)際作用。
   * @param int $start 產(chǎn)生順序號(hào)的起始值。
   * @return boolean 返回 true 表示成功。
   */
  static public function init( $start = 1 )
  {
    // 通過信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(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' 模式,如果無(wú)法打開共享內(nèi)存,可以認(rèn)為該共享內(nèi)存已經(jīng)創(chuàng)建,無(wú)需再次初始化
      $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)存,釋放信號(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()
  {
    // 通過信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(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)存中讀出順序號(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)寫入共享內(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)文章

最新評(píng)論