-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathcuid.js
80 lines (65 loc) · 1.91 KB
/
cuid.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* eslint guard-for-in:0, no-unused-vars: 0 */
/**
* 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
*/
// The file was modified to use ES2015
let c = 0;
const blockSize = 4;
const base = 36;
const discreteValues = Math.pow(base, blockSize);
function pad(num, size) {
const s = '000000000' + num;
return s.substr(s.length - size);
}
function randomBlock() {
return pad((Math.random() * discreteValues << 0).toString(base), blockSize);
}
function safeCounter() {
c = c < discreteValues ? c : 0;
c++; // this is not subliminal
return c - 1;
}
// We want to cache the results of this
const cache = (function calc() {
let count = 0;
for (const i in window) {
count++;
}
return count;
}());
function globalCount() {
return cache;
}
function browserPrint() {
const mimeTypesUAString = (
navigator.mimeTypes.length + navigator.userAgent.length
).toString(base);
return pad(mimeTypesUAString + globalCount().toString(base), 4);
}
function cuid() {
// Starting with a lowercase letter makes
// it HTML element ID friendly.
const letter = 'c'; // hard-coded allows for sequential access
// timestamp
// warning: this exposes the exact date and time
// that the uid was created.
const timestamp = (new Date().getTime()).toString(base);
// A few chars to generate distinct ids for different
// clients (so different computers are far less
// likely to generate the same id)
const fingerprint = browserPrint();
// Grab some more chars from Math.random()
const random = randomBlock() + randomBlock();
// Prevent same-machine collisions.
const counter = pad(safeCounter().toString(base), blockSize);
return letter + timestamp + counter + fingerprint + random;
}
export default cuid;