在 JavaScript 中生成随机字母数字(大写、小写和数字)字符串以用作可能唯一标识符的最短方法(在合理范围内)是什么?
JavaScript 中的随机字母数字字符串?
IT技术
javascript
random
2021-02-02 12:06:30
6个回答
我刚刚发现这是一个非常好的和优雅的解决方案:
Math.random().toString(36).slice(2)
关于这个实现的注意事项:
- 由于浮点字符串化会删除尾随零,这将生成一个长度介于 0 到 12 个字符之间的字符串,通常为 11 个字符。
- 它不会生成大写字母,只会生成小写字母和数字。
- 因为随机性来自
Math.random()
,输出可能是可预测的,因此不一定是唯一的。 - 即使假设是一个理想的实现,输出也最多有 52 位熵,这意味着在生成大约 70M 字符串后,您可以期待重复。
如果您只想允许特定字符,您也可以这样做:
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');
这是一个 jsfiddle 来演示:http : //jsfiddle.net/wSQBx/
另一种方法是使用一个特殊的字符串来告诉函数使用什么类型的字符。你可以这样做:
function randomString(length, chars) {
var mask = '';
if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if (chars.indexOf('#') > -1) mask += '0123456789';
if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\\';
var result = '';
for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
return result;
}
console.log(randomString(16, 'aA'));
console.log(randomString(32, '#aA'));
console.log(randomString(64, '#A!'));
小提琴:http : //jsfiddle.net/wSQBx/2/
或者,要使用如下所述的 base36 方法,您可以执行以下操作:
function randomString(length) {
return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}
JAR.JAR.beans 建议的另一种答案变体
(Math.random()*1e32).toString(36)
通过更改乘数,1e32
您可以更改随机字符串的长度。
更新:单行解决方案,随机 20 个字符(字母数字小写):
Array.from(Array(20), () => Math.floor(Math.random() * 36).toString(36)).join('');
或者用 lodash 更短:
_.times(20, () => _.random(35).toString(36)).join('');
或者根据 Jar Jar 的建议,这是我在最近的一个项目中使用的(为了克服长度限制):
var randomString = function (len, bits)
{
bits = bits || 36;
var outStr = "", newStr;
while (outStr.length < len)
{
newStr = Math.random().toString(bits).slice(2);
outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
}
return outStr.toUpperCase();
};
利用:
randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters
其它你可能感兴趣的问题