这是我参与更文挑战的第 18 天,活动详情查看:更文挑战
rndm 源码分析
rndm 是一个随机字符串生成器。有以下几种用法:
var salt = rndm(16) // 'QRI2x6gckpHi5wrO' 随机生成由 0-9, a-z,A-Z 组成的字符串,默认长度 10
var salt = rndm.base62() // 'mtInqvjD8N' 与 rndm() 一致
var salt = rndm.base36(5) // 'lpksf' 随机生成由 0-9,a-z 组成的字符串,默认长度 10
var salt = rndm.base10(9) // '974457528' 随机生成 0-9 组成的字符串,默认长度 10
var salt = rndm.create('ab12+-')() // '2-11b-b1b-' 随机生成由传入的字符组成的字符串,默认长度 10
源码很简单,总共只有 25 行,如下所示:
var assert = require('assert')
var base62 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
var base36 = 'abcdefghijklmnopqrstuvwxyz0123456789'
var base10 = '0123456789'
// 几个 api 都是基于 create 方法实现的
exports = module.exports = create(base62)
exports.base62 = exports
exports.base36 = create(base36)
exports.base10 = create(base10)
exports.create = create
// 闭包实现,接收一个字符串,返回一个随机数生成函数
function create(chars) {
// 判断是不是字符串类型,不是就抛出异常
assert(typeof chars === 'string', 'the list of characters must be a string!')
// 获取字符串长度
var length = Buffer.byteLength(chars)
// 返回一个随机串生成函数
return function rndm(len) {
len = len || 10 // 长度默认 10
如果传入参数不是数字,或者是小于零的数字,就抛出异常
assert(typeof len === 'number' && len >= 0, 'the length of the random string must be a number!')
var salt = ''
// 每次随机取一个字符,拼接在 salt 上
for (var i = 0; i < len; i++) salt += chars[Math.floor(length * Math.random())]
return salt
}
}
简单的随机串生成方式
看完了 rndm 的源码,这里来介绍一个简单的随机串的生成方法。
我们通常都是使用Math.random
来返回一个随机数:
Math.random() // 0~1 之间的随机值,包括 0 不包括 1
另外,我们都知道十进制是用 0~9 来表示,而 16 进制是由 0~f 来表示。那么如果是 36 进制,就囊括了 0~9、a~z 这 36 个字符。所以可以通过以下方式生成一个随机串:
Math.random().toString(36); // 0.mkujqvbhlm8
使用 toString
方法让 Math.random()
返回的值转换成 36 进制。再进一步处理,将前缀给截取掉,就可以获得一个包含 0~9、a~z 的随机字符串了。
Math.random().toString(36).slice(2); // lcrk1vi438
最后
如果文章对你有帮助,点个赞呗~