UNPKG

2.17 kBJavaScriptView Raw
1/**
2 * cuid.js
3 * Collision-resistant UID generator for browsers and node.
4 * Sequential for fast db lookups and recency sorting.
5 * Safe for element IDs and server-side lookups.
6 *
7 * Extracted from CLCTR
8 *
9 * Copyright (c) Eric Elliott 2012
10 * MIT License
11 */
12
13var fingerprint = require('./lib/fingerprint.js');
14var pad = require('./lib/pad.js');
15
16var c = 0,
17 blockSize = 4,
18 base = 36,
19 discreteValues = Math.pow(base, blockSize);
20
21function randomBlock () {
22 return pad((Math.random() *
23 discreteValues << 0)
24 .toString(base), blockSize);
25}
26
27function safeCounter () {
28 c = c < discreteValues ? c : 0;
29 c++; // this is not subliminal
30 return c - 1;
31}
32
33function cuid () {
34 // Starting with a lowercase letter makes
35 // it HTML element ID friendly.
36 var letter = 'c', // hard-coded allows for sequential access
37
38 // timestamp
39 // warning: this exposes the exact date and time
40 // that the uid was created.
41 timestamp = (new Date().getTime()).toString(base),
42
43 // Prevent same-machine collisions.
44 counter = pad(safeCounter().toString(base), blockSize),
45
46 // A few chars to generate distinct ids for different
47 // clients (so different computers are far less
48 // likely to generate the same id)
49 print = fingerprint(),
50
51 // Grab some more chars from Math.random()
52 random = randomBlock() + randomBlock();
53
54 return letter + timestamp + counter + print + random;
55}
56
57cuid.slug = function slug () {
58 var date = new Date().getTime().toString(36),
59 counter = safeCounter().toString(36).slice(-4),
60 print = fingerprint().slice(0, 1) +
61 fingerprint().slice(-1),
62 random = randomBlock().slice(-2);
63
64 return date.slice(-2) +
65 counter + print + random;
66};
67
68cuid.isCuid = function isCuid (stringToCheck) {
69 if (typeof stringToCheck !== 'string') return false;
70 if (stringToCheck.startsWith('c')) return true;
71 return false;
72};
73
74cuid.isSlug = function isSlug (stringToCheck) {
75 if (typeof stringToCheck !== 'string') return false;
76 var stringLength = stringToCheck.length;
77 if (stringLength >= 7 && stringLength <= 10) return true;
78 return false;
79};
80
81cuid.fingerprint = fingerprint;
82
83module.exports = cuid;