首頁 > 後端開發 > php教程 > 如何實現用戶id產生一個唯一邀請碼

如何實現用戶id產生一個唯一邀請碼

小云云
發布: 2023-03-21 11:16:01
原創
17513 人瀏覽過

根據使用者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;
}
登入後複製

相關推薦:

#php產生隨機唯一邀請碼/優惠碼固定長度

#

以上是如何實現用戶id產生一個唯一邀請碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板