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

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

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

錯(cuò)誤思路

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

所以可以將用戶id插入到生成的字符串中弹灭,隔一個(gè)字符插入一個(gè)id的數(shù)字督暂,這樣id混合在字符串中,不容易暴露穷吮,但是長度問題并沒有得到優(yōu)化逻翁,于是把隔一個(gè)字符插入一個(gè)id的數(shù)字改為隔一個(gè)字符插入兩個(gè)id的數(shù)字。然而長度好像并沒有受到太大的影響捡鱼。

正解

思考:一個(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)碼保證了唯一性缠诅,并且長度不會(huì)太長溶浴,用戶id也能夠根據(jù)邀請(qǐng)碼反推出來,但是有一點(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的情況下隅熙,是沒辦法解出正確的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;
}

我的博客:根據(jù)用戶id生成一個(gè)唯一邀請(qǐng)碼,歡迎各位大神一起交流狞洋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弯淘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吉懊,更是在濱河造成了極大的恐慌庐橙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借嗽,死亡現(xiàn)場離奇詭異态鳖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恶导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門浆竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惨寿,你說我怎么就攤上這事邦泄。” “怎么了裂垦?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵顺囊,是天一觀的道長。 經(jīng)常有香客問我蕉拢,道長特碳,這世上最難降的妖魔是什么诚亚? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮午乓,結(jié)果婚禮上站宗,老公的妹妹穿的比我還像新娘。我一直安慰自己益愈,他們只是感情好份乒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腕唧,像睡著了一般或辖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枣接,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天颂暇,我揣著相機(jī)與錄音,去河邊找鬼但惶。 笑死耳鸯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膀曾。 我是一名探鬼主播县爬,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼添谊!你這毒婦竟也來了财喳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤斩狱,失蹤者是張志新(化名)和其女友劉穎耳高,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所踊,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泌枪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秕岛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碌燕。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖继薛,靈堂內(nèi)的尸體忽然破棺而出修壕,到底是詐尸還是另有隱情,我是刑警寧澤惋增,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布叠殷,位于F島的核電站改鲫,受9級(jí)特大地震影響诈皿,放射性物質(zhì)發(fā)生泄漏林束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一稽亏、第九天 我趴在偏房一處隱蔽的房頂上張望壶冒。 院中可真熱鬧,春花似錦截歉、人聲如沸胖腾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咸作。三九已至,卻和暖如春宵睦,著一層夾襖步出監(jiān)牢的瞬間记罚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工壳嚎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桐智,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓烟馅,卻偏偏與公主長得像说庭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郑趁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文來源網(wǎng)絡(luò)版權(quán)歸原作者所有 需求描述:根據(jù)用戶id生成與之對(duì)應(yīng)的 唯一邀請(qǐng)碼 刊驴,范圍為‘0-9A-Z’。 這個(gè)需...
    烏云龍閱讀 1,830評(píng)論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理寡润,服務(wù)發(fā)現(xiàn)缺脉,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法悦穿,類相關(guān)的語法攻礼,內(nèi)部類的語法,繼承相關(guān)的語法栗柒,異常的語法礁扮,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 當(dāng)時(shí)好多好多都為了看《太陽的后裔》而買了愛奇藝會(huì)員[憨笑] 在我十幾歲情竇初開的時(shí)候,經(jīng)常想我以后的男朋友會(huì)長什么...
    彡十不凡閱讀 209評(píng)論 0 0
  • 一瞬沦,一個(gè)電話 ”相關(guān)資料我已經(jīng)發(fā)到了你的郵箱了太伊,查收過后沒什么疑問就把尾款打過來就行了」渥辏”我玩著電腦上的掃雷游戲一...
    寧為魂閱讀 419評(píng)論 2 3