generate = function (size, chars) { if( chars ) { validateTokenChars(chars); } else { chars = options.chars; } var max = Math.floor(256 / chars.length) * chars.length; var ret = ""; while( ret.length < size ) { var buf = options.source(size - ret.length); for(var i=0;i<buf.length;i++) { var x = buf.readUInt8(i); if( x < max ) { ret += chars[x % chars.length]; } } } return ret; }
...
# Usage
// Create a token generator with the default settings:
var randtoken = require('rand-token');
// Generate a 16 character alpha-numeric token:
var token = randtoken.generate(16);
// Use it as a replacement for uid:
var uid = require('rand-token').uid;
var token = uid(16);
// Generate mostly sequential tokens:
var suid = require('rand-token').suid;
...
function buildGenerator(options) { assert(!options || typeof(options) == 'object'); options = options || {}; options.chars = options.chars || defaults.chars; options.source = options.source || defaults.source; // Allowed characters switch( options.chars ) { case 'default': options.chars = alphaNumeric; break; case 'a-z': case 'alpha': options.chars = alphaLower; break; case 'A-Z': case 'ALPHA': options.chars = alphaUpper; break; case '0-9': case 'numeric': options.chars = numeric; break; case 'base32': options.chars = alphaUpper + "234567"; break; default: // use the characters as is } validateTokenChars(options.chars); // Source of randomness: switch( options.source ) { case 'default': options.source = function(size, cb) { return cryptoRandomBytes(size, !cb ? null : function (buf){ return cb(null, buf); }); }; break; case 'crypto': options.source = crypto.randomBytes; break; case 'math': options.source = function(size, cb) { var buf = new Buffer(size); for(var i=0;i<size;i++) { buf.writeUInt8(Math.floor(256 * Math.random()), i); } if( cb ) { cb(null, buf); } else { return buf; } }; break; default: assert(typeof(options.source) == 'function'); } return { "generate": function(size, chars) { if( chars ) { validateTokenChars(chars); } else { chars = options.chars; } var max = Math.floor(256 / chars.length) * chars.length; var ret = ""; while( ret.length < size ) { var buf = options.source(size - ret.length); for(var i=0;i<buf.length;i++) { var x = buf.readUInt8(i); if( x < max ) { ret += chars[x % chars.length]; } } } return ret; } }; }
...
// Generate a 24 (16 + 8) character alpha-numeric token:
var token = suid(16)
To generate only lower case letters (a-z):
// Create a token generator with the default settings:
var randtoken = require('rand-token').generator({
chars: 'a-z'
});
// Generate a 16 character token:
var token = randtoken.generate(16);
Alternatively, you can create a generator with the default options and pass the characters to use as the second parameter to `generate
`:
...
suid = function (length, epoch, prefixLength) { epoch = epoch || defaultEpoch; prefixLength = prefixLength || defaultPrefixLength; return suidPrefix(epoch, prefixLength) + defaultGenerator.generate(length); }
n/a
uid = function (size, chars) { if( chars ) { validateTokenChars(chars); } else { chars = options.chars; } var max = Math.floor(256 / chars.length) * chars.length; var ret = ""; while( ret.length < size ) { var buf = options.source(size - ret.length); for(var i=0;i<buf.length;i++) { var x = buf.readUInt8(i); if( x < max ) { ret += chars[x % chars.length]; } } } return ret; }
n/a