根据用户id生成一个唯一邀请码
1 | 需求描述:根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。 |
这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。
错误思路
随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用。
所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,于是把隔一个字符插入一个id的数字改为隔一个字符插入两个id的数字。然而长度好像并没有受到太大的影响。
正解
思考:一个10进制的数字短还是一个16进制的数字短?
肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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的。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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的唯一邀请码就生成了,再附一个解码函数:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 ; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥