常见不查数据库的邀请码方案,大部分是利用进制转换或自定义补位加密的方式实现,无法避免生成的邀请码依然比较规律。
函数思路
/**
* 生成6位邀请码,无规律、唯一、不重复
* @author 行者无疆 <295380131@qq.com>
* @param $id int 0到54652751936区间的整数
* @return string 6位邀请码
*/
function inviteCode6($id)
{
//10进制转2进制翻转,补位避免数字翻转塌陷。
$id = base_convert('1' . substr(strrev((base_convert($id + 3221225472, 10, 2))), 0, -1), 2, 10);
//字典字母顺序可打乱
$dict = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$base = strlen($dict);
$code = '';
//自定义进制转换
do {
$code = $dict[bcmod($id, $base)] . $code;
$id = bcdiv($id, $base);
} while ($id > 0);
return $code;
}
进一步优化思路
-
函数可进一步封装自定义字典,自定义输出位数【有时间我会封装一下也发出来】。
-
同样的原理通过打乱字典、更换翻转进制、调整起点基数,即可改造成简单对称加密函数。
-
如果不需要解密获取传入的id,可随机固定前几位再连接id的方式传入实现完全不可逆且唯一。