UNPKG

cuid

Version:

Collision-resistant ids optimized for horizontal scaling and performance. For node and browsers.

129 lines (102 loc) 4.23 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.cuid = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ /** * cuid.js * Collision-resistant UID generator for browsers and node. * Sequential for fast db lookups and recency sorting. * Safe for element IDs and server-side lookups. * * Extracted from CLCTR * * Copyright (c) Eric Elliott 2012 * MIT License */ var fingerprint = require('./lib/fingerprint.js'); var pad = require('./lib/pad.js'); var getRandomValue = require('./lib/getRandomValue.js'); var c = 0, blockSize = 4, base = 36, discreteValues = Math.pow(base, blockSize); function randomBlock () { return pad((getRandomValue() * discreteValues << 0) .toString(base), blockSize); } function safeCounter () { c = c < discreteValues ? c : 0; c++; // this is not subliminal return c - 1; } function cuid () { // Starting with a lowercase letter makes // it HTML element ID friendly. var letter = 'c', // hard-coded allows for sequential access // timestamp // warning: this exposes the exact date and time // that the uid was created. timestamp = (new Date().getTime()).toString(base), // Prevent same-machine collisions. counter = pad(safeCounter().toString(base), blockSize), // A few chars to generate distinct ids for different // clients (so different computers are far less // likely to generate the same id) print = fingerprint(), // Grab some more chars from Math.random() random = randomBlock() + randomBlock(); return letter + timestamp + counter + print + random; } cuid.slug = function slug () { var date = new Date().getTime().toString(36), counter = safeCounter().toString(36).slice(-4), print = fingerprint().slice(0, 1) + fingerprint().slice(-1), random = randomBlock().slice(-2); return date.slice(-2) + counter + print + random; }; cuid.isCuid = function isCuid (stringToCheck) { if (typeof stringToCheck !== 'string') return false; if (stringToCheck.startsWith('c')) return true; return false; }; cuid.isSlug = function isSlug (stringToCheck) { if (typeof stringToCheck !== 'string') return false; var stringLength = stringToCheck.length; if (stringLength >= 7 && stringLength <= 10) return true; return false; }; cuid.fingerprint = fingerprint; module.exports = cuid; },{"./lib/fingerprint.js":2,"./lib/getRandomValue.js":3,"./lib/pad.js":4}],2:[function(require,module,exports){ var pad = require('./pad.js'); var env = typeof window === 'object' ? window : self; var globalCount = Object.keys(env).length; var mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0; var clientId = pad((mimeTypesLength + navigator.userAgent.length).toString(36) + globalCount.toString(36), 4); module.exports = function fingerprint () { return clientId; }; },{"./pad.js":4}],3:[function(require,module,exports){ var getRandomValue; var crypto = typeof window !== 'undefined' && (window.crypto || window.msCrypto) || typeof self !== 'undefined' && self.crypto; if (crypto) { var lim = Math.pow(2, 32) - 1; getRandomValue = function () { return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim); }; } else { getRandomValue = Math.random; } module.exports = getRandomValue; },{}],4:[function(require,module,exports){ module.exports = function pad (num, size) { var s = '000000000' + num; return s.substr(s.length - size); }; },{}]},{},[1])(1) });