有时候我们有生成随机数的一些想法,可能会直接想使用 Math.random,但这个Math.random 优缺也很明显,优点简单方便兼容性高,缺点就是算法固定,后续可能会预测,且全是数字,长度也不固定,对于一些场景不太友好
我们可以通过使用码表 + 随机数偏移的方式生成随机数,这样效率实际也不低,且不仅仅是纯数字了,长度也固定了,并且码表也是可以随机变动的,这样上面的一些隐患实际就没了
js
//码表可以扩展加乱序,可打乱减少被预测概率,这里就不写码表打乱的算法了,我们就解决数字 + 长度问题,看起来舒服
const mapString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//生成随机数,根据随机数生成偏移,取出码表中的一个字符,根据长度取出指定个数
function getRandomString(length) {
let result = "";
const charactersLength = mapString.length;
for (let i = 0; i < length; i++) {
//当然想进一步提速,也可以转化为数组的访问,这里不多做操作了
result += mapString[Math.floor(Math.random() * charactersLength)];
}
return result;
}
如果对于码表没有要求的话仅仅是当一个唯一id的话,我们实际上直接将随机数转化成36进制字符串,取出其中一项就行了,实际上转化成36进制,取出其中一项,就是 [0-9a-z]+ 了,但感觉没上面好
js
function getRandomString(length) {
let result = '';
for (let i = 0; i < length; i++) {
result += Math.random().toString(36).charAt(2);
}
return result;
}
看了上面的写法,是不是感觉思路更多了,确实如此,我们实际使用的话,就使用第一种方案感觉就挺好的,不管是生成表单的id,还是生成其他地方的随机数,都足够用了😄