方法一:
Math.random().toString(36).slice(-8) Math.random() // 生成随机数字, eg: 0.123456 .toString(36) // 转化成36进制 : "0.4fzyo82mvyr" .slice(-8);// 截取最后八位 : "yo82mvyr"
36进制包含的字符为 0-9,a-z。
10进制包含的字符为为 0-9。
16进制包含的字符为 0-9,a-f。
缺点:
- 只能生成有 0-9、a-z字符组成的字符串
- 由于
Math.random()
生成的18位小数,可能无法填充36位,最后几个字符串,只能在指定的几个字符中选择。导致随机性降低。 - 某些情况下会返回空值。例如,当随机数为 0, 0.5, 0.25, 0.125...时,返回为空值。
方法二:
function randomString(length, chars) { var result = ''; for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; return result; } var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
方法三:
node中使用crypto生成:
'use strict'; const crypto = require('crypto'); module.exports = len => { // isFinite 判断是否为有限数值 if (!Number.isFinite(len)) { throw new TypeError('Expected a finite number'); } return crypto.randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len); };
crypto.randomBytes(size[, callback])
:
作用:生成加密强伪随机数据. size参数是指示要生成的字节数的数值。
crypto.randomBytes
生成的是字节数。
因此,若 size
为1(1个字节8位),则最后转化成16进制(4位)时,为2个字符。