在JavaScript中如何生成随机字符串 您所在的位置:网站首页 javascript随机数计算 在JavaScript中如何生成随机字符串

在JavaScript中如何生成随机字符串

2023-09-25 09:13| 来源: 网络整理| 查看: 265

背景

在上一篇 开放API接口验证机制设计与应用 中,使用到了随机字符串,用来防御请求重放攻击。在代码实现时,我们使用了 node-randomstring 这个第三方包,来生成随机字符串。

于是,就想如何使用原生JavaScript生成随机字符串。

问题描述

原生实现生成随机字符串

解决方法 方法一 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...时,返回为空值。

在我的电脑上执行这种方式生成字符串。1000万次中出现重复的概率为 0。 点此测试重复几率

方法二

可指定字符集

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'); 方法三

在NodeJS中,使用 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个字符。

总结

第一种方法代码精简,可以快速获取随机字符串。但是存在较多缺点,不建议在生产中使用。对于对字符集有特定要求的场景,可以使用第二种方法。

参考资料 WIKI - 通用唯一识别码 node-randomstring Create GUID / UUID in JavaScript? Generate random string/characters in JavaScript


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有