生成6位邀请码,无规律、唯一、不重复

介绍了一种通过数字翻转及自定义进制转换生成无规律邀请码的方法,并提供了具体实现函数,该方法能够确保邀请码的唯一性和无规律性。
常见不查数据库的邀请码方案,大部分是利用进制转换或自定义补位加密的方式实现,无法避免生成的邀请码依然比较规律。

函数思路

  • 利用数字翻转后也是唯一的特点,就可以实现数字较大幅度无规律变化之后再做进制转换,只要翻转过程始终处在6位进制的区间就可以实现唯一。
    
  • 转2进制翻转是为了扩大范围容量,其实用10进制翻转后有90亿的容量也是足够用的。
    
/**
 * 生成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的方式传入实现完全不可逆且唯一。
c++14。请针对每一个子任务写一个程序 题目描述: Mark Douglas 是一名律师。他的客户 Yuri Ball 在一场车祸中幸去世。为了帮助 Yuri 的亲属拿到他的遗产,Mark 需要得到一个密码。在 Yuri 的笔记本上,有一个长为 $2n$ 的只包含小写字母的字符串,Mark 知道密码恰好是将这个字符串分解为两个长度为 $n$ 的子序列且它们构成的字符串恰好相反的方案数。我们认为两种分解方法是同的,当且仅当两个下标集合构成的集合 ${S1, S2}$ 是同的,注意 ${S1, S2}$ 和 ${S2, S1}$ 我们认为是相同的分解方法。如 cabaacba 的合法分解共有 **c** aba **a** c **ba** 和 **c** ab **a** ac **ba** 两种。Mark 希望你能帮助他计算出密码,事成之后他决定分给你six million five hundred thousand dollars并邀请你去柬埔寨度假。 输入格式: 第一行为一个正整数 $n$。 第二行为一个长度为 $2n$ 的字符串,仅包含小写字母。 输出格式: 输出仅一行表示答案。 样例输入: 样例1 ``` 4 cabaacba ``` 样例2 ``` 16 vonyzabjdefghijkkjihgfedjbazynov ``` 样例输出: 样例1 ``` 2 ``` 样例2 ``` 32768 ``` 提示: 对于所有的测试点:$1 \le n \le 18$。 子任务 1($28\%$):$1 \le n \le 10$。 子任务 2($12\%$):字符串中仅有小写字符 $a$。 子任务 3($16\%$):字符串中除去两个 $b$ 外都是 $a$。 子任务 4($16\%$):字符串中仅有 $a,b$ 两种字符。 子任务 5($25\%$)。
最新发布
11-27
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值