原因是关于随机不重复字符串。如果没有长度限制,那么最简单的方法就是当前时间戳+固定位数的随机字符串就完全可以了(重复的概率还是有的,但是几乎可以忽略不计),至于长度,有很多方法可以解决,但最终不能很短。最近公司有个小要求,要求把邀请码缩减为四位数。四位数字不重复邀请码的实现,没有那么随意。直观的思路是用10个数字(0-9)+26个小写字母(a-z))排列组合实现,即所谓的排列可重复问题。这类问题的公式如下,每次有n种选择,选择r次的排列总数为:n的r次方。这很容易理解。一次有n个选择,第二次有n*n个选择,……,第r次有nr个选择。对应我们的需求,也就是可以有36的4次方=1679616的组合,完全可以满足一个小项目的需求。如果项目比较大,可以通过在可选列表中添加其他项目(如特殊字符、大写字母等)来实现,最后通过增加邀请码的数量来进一步扩展。思路比较直观简单,但也比较实用。欢迎大家学习交流。实现思路:1、首先确定随机数的依据,以增量数(可以对应数据库id)为依据创建随机串。2.打乱10个数字+26个字母的组合,让随机数看起来更舒服。3、将基数转换为36位数字,转换后不足4位补0。4、将四位数字分别作为下标,对应打乱后的10个数字+26个字母的组合列表。5.组合成4个独特的随机字符串。代码如下:exports.random=(number)=>{//打乱10个数字+26个字母constarr=["m","0","j","f","8","o""z","w","5","t","p","a","1","d","s","h","v","x"",“9”,“b”,“r”,“y”,“2”,“e”,“7”,“4”,“3”,“q”,“6”,“n”,“u”","l","c","g","i","k"];//将数字从十进制转换为十六进制consttransNumber=binaryConversion(+number,10,36);//排除大于的情况4digitsconstlen=transNumber.toString().length;if(len>4){console.log('数字过大');return;}//转换后的数字小于4位则添加0位,转成数组constlist=prefixInteger(transNumber,4).toString().split('');constlen4Arr=[];for(constnumoflist){//判断当前字符是不是anumberoraletterconsttype=checkStrType(num);//如果是数字则不处理,如果是字母则转换成对应的数组(10-35)constindex=type==='string'?stringTonum(num)+9:num;len4Arr.push(arr[+index]);}//返回结果returnlen4Arr.join('');}补充缺点:不能创建36以下的基数,比如大于36的起始数,欢迎大家提出高效的思路,不足之处请指出。其他代码如下:'0')+num).slice(-length);}functionstringTonum(a){conststr=a.toLowerCase().split('');constal=str.length;constgetCharNumber=charx=>charx.charCodeAt()-96;让numout=0;让charnum=0;for(leti=0;i
