十位用戶唯一ID生成策略


新浪微博和twitter 等系統都有一竄數字ID來標示一個唯一的用戶,這篇文章就是記錄如何實現這種唯一數字ID

原理:使用MYSQL 自增ID 拼接任意字符..然后使用進制轉換打亂規則

一般來說實現唯一性可以使用uniqid 或者time之類的方式生成,但是考慮到多台系統,也就是分布式系統。這種方式就不准確了。

實現:

新建一個數據庫:

CREATE TABLE `user_number_id` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `stub` char(1) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM

使用replace into 來取得生成的ID

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID() as number_id;

取得number_id后生成十位數字ID

function auID($autoID)
{
    $autoID = $autoID;
    $autoCharacter = array("1","2","3","4","5","6","7","8","9","A","B","C","D","E");
    $len = 7-((int)log10($autoID) + 1);
    $i=1;
    $numberID = mt_rand(1, 2).mt_rand(1, 4);
    for($i;$i<=$len-1;$i++)
    {
        $numberID .= $autoCharacter[mt_rand(1, 13)];
    }

    return base_convert($numberID."E".$autoID, 16, 10);
    //--->這里因為autoid永遠不可能為E所以使用E來分割保證不會重復
}

base_convert 轉換16進制到10進制,只要16進制不同那么10進制就一定不同,因為10位十進制最大可取范圍:9999999999轉換成16進制是2540BE3FF所以前兩位可取值是固定的mt_rand(1, 2).mt_rand(1, 4)

以下是測試用例表明沒有重復(內存問題只測到55萬):

static $array=array();
for($j=1;$j<=550000;$j++)
{
  $array[] = auID($j);
}


print_r(count(array_unique($array)));

function array_repeat($arr) 
{ 
  if(!is_array($arr)) return $arr; 
    
  $arr1 = array_unique($arr); 
    
  $arr3 = array_diff_key($arr,$arr1);  

  return array_unique($arr3); 
}

print_r(array_repeat($array));

最后funition:

function auID()
{
    $autoID = mt_rand(1, 550000);
    $autoCharacter = array("1","2","3","4","5","6","7","8","9","A","B","C","D","E");
    $len = 7-((int)log10($autoID) + 1);
    $i=1;
    $numberID = mt_rand(1, 2).mt_rand(1, 4);
    for($i;$i<=$len-1;$i++)
    {
        $numberID .= $autoCharacter[mt_rand(1, 13)];
    }
    return base_convert($numberID."E".$autoID, 16, 10); //--->這里因為autoid永遠不可能為E所以使用E來分割保證不會重復
}

var_dump(auID());

 

考慮到可能會有主從需求,id生成應該去取同一個數據表的數據,或者設置好自增id,如主服務器1357,從服務器2468

參考:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

來源地址:http://ray-cheng.github.io/kss/php/2014/07/07/decade-user_id-strategy.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM