- A+
所属分类:PHP
在开发中,我们可能会遇到需要生成用户唯一的邀请码,来做一些邀请活动,接下来,我们思考如何生成唯一的邀请码,且可以根据邀请码获取到用户id。
首先,我们可以考虑使用用户user_id 来生成邀请码,并生成一个随机的字符串,将user_id 插入到字符串的某个特定位置,但是这样user_id十分容易暴露,因此我们考虑使用字母(A-Z)和数字(0-9)来生成邀请码。
由于A-Z以及0-9共有 36个字符,因为将user_id 转换为 36进制即可。
如下:
function createCode($user_id) { $sourceString= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $num = $user_id; $code = ''; while($num) { $mod = $num % 36; $num = ($num - $mod) / 36; $code = $sourceString[$mod].$code; } return $code; }
我们来优化上面的代码:
①由于user_id 的位数不固定,所以生成的邀请码长度会不一致,我们可以在生成的$code 左侧统一补充0;
②sourceString 的顺序我们可以换成一个随机的字符串,这样安全性会更好。
如下:
function getUserInviteCode($userId) { $sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'; $code = ''; while ($userId > 0) { $mod = $userId % 35; $userId = ($userId - $mod) / 35; $code = $sourceString[$mod] . $code; } if (strlen($code) < 8) $code = str_pad($code, 8, '0', STR_PAD_LEFT); return $code; }
下面我们再写一个解码函数即可:
function getUserIdByInviteCode($code) { $sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'; //移除左侧的 0 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($sourceString, $code[$i]) * pow(35, $i); } return $num; }