You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.2 KiB
84 lines
2.2 KiB
/** |
|
* 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;
|
|
|