1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- "use strict";
- var isObject = require("type/object/is")
- , ensureNaturalNumber = require("type/natural-number/ensure")
- , ensureString = require("type/string/ensure");
- var generated = Object.create(null), random = Math.random, uniqTryLimit = 100;
- var getChunk = function () { return random().toString(36).slice(2); };
- var getString = function (length, charset) {
- var str;
- if (charset) {
- var charsetLength = charset.length;
- str = "";
- for (var i = 0; i < length; ++i) {
- str += charset.charAt(Math.floor(Math.random() * charsetLength));
- }
- return str;
- }
- str = getChunk();
- if (length === null) return str;
- while (str.length < length) str += getChunk();
- return str.slice(0, length);
- };
- module.exports = function (/* options */) {
- var options = arguments[0];
- if (!isObject(options)) options = {};
- var length = ensureNaturalNumber(options.length, { "default": 10 })
- , isUnique = options.isUnique
- , charset = ensureString(options.charset, { isOptional: true });
- var str = getString(length, charset);
- if (isUnique) {
- var count = 0;
- while (generated[str]) {
- if (++count === uniqTryLimit) {
- throw new Error(
- "Cannot generate random string.\n" +
- "String.random is not designed to effectively generate many short and " +
- "unique random strings"
- );
- }
- str = getString(length);
- }
- generated[str] = true;
- }
- return str;
- };
|