1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | var fingerprint = require('./lib/fingerprint.js');
|
14 | var pad = require('./lib/pad.js');
|
15 |
|
16 | var c = 0,
|
17 | blockSize = 4,
|
18 | base = 36,
|
19 | discreteValues = Math.pow(base, blockSize);
|
20 |
|
21 | function randomBlock () {
|
22 | return pad((Math.random() *
|
23 | discreteValues << 0)
|
24 | .toString(base), blockSize);
|
25 | }
|
26 |
|
27 | function safeCounter () {
|
28 | c = c < discreteValues ? c : 0;
|
29 | c++;
|
30 | return c - 1;
|
31 | }
|
32 |
|
33 | function cuid () {
|
34 |
|
35 |
|
36 | var letter = 'c',
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | timestamp = (new Date().getTime()).toString(base),
|
42 |
|
43 |
|
44 | counter = pad(safeCounter().toString(base), blockSize),
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | print = fingerprint(),
|
50 |
|
51 |
|
52 | random = randomBlock() + randomBlock();
|
53 |
|
54 | return letter + timestamp + counter + print + random;
|
55 | }
|
56 |
|
57 | cuid.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 |
|
68 | cuid.isCuid = function isCuid (stringToCheck) {
|
69 | if (typeof stringToCheck !== 'string') return false;
|
70 | if (stringToCheck.startsWith('c')) return true;
|
71 | return false;
|
72 | };
|
73 |
|
74 | cuid.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 |
|
81 | cuid.fingerprint = fingerprint;
|
82 |
|
83 | module.exports = cuid;
|