源码系列 —— rndm

·  阅读 200

这是我参与更文挑战的第 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
复制代码

最后

如果文章对你有帮助,点个赞呗~

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改