Source: randomEncodingAESKey.js

'use strict';

var source = new Buffer(62);
var zero = new Buffer('0')[0]; // ASCII 0
var A = new Buffer('A')[0]; // ASCII A
var a = new Buffer('a')[0]; // ASCII a

var offset = 0;
for (var i = 0; i < 10; i++) {
  source[offset++] = i + zero;
}
for (var _i = 0; _i < 26; _i++) {
  source[offset++] = _i + A;
}
for (var _i2 = 0; _i2 < 26; _i2++) {
  source[offset++] = _i2 + a;
}

/**
 * 获取指定范围内的随机数
 * @private
 * @param {Number} min - 最小值
 * @param {Number} max - 最大值
 * @return {Number}
 */
function random(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

/**
 * @module open-service-node-sdk/lib/randomEncodingAESKey
 * @author xuyuanxiang <xuyuanxiang@wosai-inc.com> ({@link http://xuyuanxiang.me})
 * @description 数据加密密钥,
 * 生成规则:从`[0-9]`、`[A-Z]`、`[a-z]`中随机提取,组成长度为`{43}`位的字符串。
 * @example
 * const randomEncodingAESKey = require('open-service-node-sdk/lib/randomEncodingAESKey');
 * const assert = require('assert');
 *
 * // 数据加密密钥(43位)
 * const encodingAESKey = randomEncodingAESKey();
 * assert(/^[a-zA-Z0-9]{43}$/.test(encodingAESKey));
 * console.log(encodingAESKey);
 *
 * // 自定义16位随机字符
 * assert(/^[a-zA-Z0-9]{16}$/.test(randomEncodingAESKey(16)));
 * @param {Number} len - 所需生成随机字符串的长度,缺省:43位。
 * @return {String} 数据加密密钥
 */
module.exports = function randomEncodingAESKey() {
  var len = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 43;

  var buff = new Buffer(len);
  var offset = 0;
  while (offset < len) {
    buff[offset++] = source[random(0, 62)];
  }
  return buff.toString('ascii');
};