根據(jù)用戶id生成一個(gè)唯一邀請(qǐng)碼

本文來(lái)源網(wǎng)絡(luò)版權(quán)歸原作者所有

需求描述:根據(jù)用戶id生成與之對(duì)應(yīng)的 唯一邀請(qǐng)碼 ,范圍為‘0-9A-Z’。

這個(gè)需求的重點(diǎn)在于加粗的部分,也就是要能夠根據(jù)邀請(qǐng)碼反推出用戶ID,這樣邀請(qǐng)碼就不用入庫(kù)了,在用戶量很大的情況下,性能可以得到不小的提升。

錯(cuò)誤思路

隨機(jī)生成一個(gè)字符串,再將用戶id拼接到字符串后面,但是這樣id就太明顯了,容易暴露,而且如果id很長(zhǎng)的話,會(huì)導(dǎo)致邀請(qǐng)碼很長(zhǎng),不利于用戶使用。

所以可以將用戶id插入到生成的字符串中,隔一個(gè)字符插入一個(gè)id的數(shù)字,這樣id混合在字符串中,不容易暴露,但是長(zhǎng)度問(wèn)題并沒(méi)有得到優(yōu)化,于是把隔一個(gè)字符插入一個(gè)id的數(shù)字改為隔一個(gè)字符插入兩個(gè)id的數(shù)字。然而長(zhǎng)度好像并沒(méi)有受到太大的影響。

正解

思考:一個(gè)10進(jìn)制的數(shù)字短還是一個(gè)16進(jìn)制的數(shù)字短?
肯定是16進(jìn)制相對(duì)短一些,所以我們可以直接把用戶id轉(zhuǎn)成10+26=36進(jìn)制的不就可以了嗎?具體代碼如下:

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;
}

邀請(qǐng)碼保證了唯一性,并且長(zhǎng)度不會(huì)太長(zhǎng),用戶id也能夠根據(jù)邀請(qǐng)碼反推出來(lái),但是有一點(diǎn)不好的是,別人也可以根據(jù)邀請(qǐng)碼去反推出user_id,因此,我們需要做一些優(yōu)化。

優(yōu)化

把0剔除,當(dāng)做補(bǔ)位符號(hào),比如小于四位的邀請(qǐng)碼在高位補(bǔ)0,這樣36進(jìn)制就變成了35進(jìn)制,然后把字符串順序打亂,這樣,在不知道$source_string的情況下,是沒(méi)辦法解出正確的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;
}

這樣,對(duì)應(yīng)user_id的唯一邀請(qǐng)碼就生成了,再附一個(gè)解碼函數(shù):

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 需求描述:根據(jù)用戶id生成與之對(duì)應(yīng)的唯一邀請(qǐng)碼,范圍為‘0-9A-Z’。 這個(gè)需求的重點(diǎn)在于加粗的部分,也就是要能...
    xx_路飛閱讀 15,006評(píng)論 22 105
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,687評(píng)論 18 399
  • 最近優(yōu)化項(xiàng)目,整理了一下如何分析第三方統(tǒng)計(jì)上來(lái)的bug; 前提是你知道了bug出現(xiàn)的當(dāng)前的.dSYM,分渠道匹配....
    向文軍閱讀 5,282評(píng)論 5 12
  • 九月的一個(gè)清晨,金色的陽(yáng)光已遍灑大地,道路旁的兩側(cè)草地中,昨晚蜘蛛在蒿草間新結(jié)的無(wú)數(shù)小小蛛網(wǎng),還兜著一網(wǎng)晨露。 田...
    mitsusie閱讀 477評(píng)論 0 1

友情鏈接更多精彩內(nèi)容