如何?使用者id產生一個唯一邀請碼

來源:互聯網
上載者:User
根據使用者id產生與之對應的唯一邀請碼,範圍為‘0-9A-Z’。這個需求的重點在於加粗的部分,也就是要能夠根據邀請碼反推出使用者ID,這樣邀請碼就不用入庫了,在使用者量很大的情況下,效能可以得到不小的提升。

錯誤思路

隨機產生一個字串,再將使用者id拼接到字串後面,但是這樣id就太明顯了,容易暴露,而且如果id很長的話,會導致邀請碼很長,不利於使用者使用。

所以可以將使用者id插入到產生的字串中,隔一個字元插入一個id的數字,這樣id混合在字串中,不容易暴露,但是長度問題並沒有得到最佳化,於是把隔一個字元插入一個id的數字改為隔一個字元插入兩個id的數字。然而長度好像並沒有受到太大的影響。

正解

思考:一個10進位的數字短還是一個16進位的數字短?
肯定是16進位相對短一些,所以我們可以直接把使用者id轉成10+26=36進位的不就可以了嗎?具體代碼如下:

function createCode($user_id){    static $source_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';    $num = $user_id;    $code = '';    while($num)    {        $mod = $num % 36;         $num = ($num - $mod) / 36;        $code = $source_string[$mod].$code;    }    return $code;}

邀請碼保證了唯一性,並且長度不會太長,使用者id也能夠根據邀請碼反推出來,但是有一點不好的是,別人也可以根據邀請碼去反推出user_id,因此,我們需要做一些最佳化。

最佳化

把0剔除,當做補位符號,比如小於四位的邀請碼在高位補0,這樣36進位就變成了35進位,然後把字串順序打亂,這樣,在不知道$source_string的情況下,是沒辦法解出正確的user_id的。

代碼如下:

function createCode($user_id) {    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';    $num = $user_id;    $code = '';    while ( $num > 0) {        $mod = $num % 35;        $num = ($num - $mod) / 35;        $code = $source_string[$mod].$code;    }    if(empty($code[3]))        $code = str_pad($code,4,'0',STR_PAD_LEFT);    return $code;}

這樣,對應user_id的唯一邀請碼就產生了,再附一個解碼函數:

function decode($code) {    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';    if (strrpos($code, '0') !== false)        $code = substr($code, strrpos($code, '0')+1);    $len = strlen($code);    $code = strrev($code);    $num = 0;    for ($i=0; $i < $len; $i++) {        $num += strpos($source_string, $code[$i]) * pow(35, $i);    }    return $num;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.