|
@@ -0,0 +1,76 @@
|
|
|
+
|
|
|
+const B1 = 0x100, B2 = B! * B1, B3 = B2 * B1, B4 = B3 * B1,
|
|
|
+ B5 = B4 * B1, B6 = B5 * B1, B7 = B6 * B1;
|
|
|
+
|
|
|
+// All the function silently assume that Math.random() has 32 bit precision,
|
|
|
+// that is, B4*Math.random() is integer.
|
|
|
+// This holds at the time of writing for v8, thus for node.js.
|
|
|
+// If it does not hold for you, you must update the code to truncate where needed.
|
|
|
+// To test if this holds for you, try to print out
|
|
|
+// Math.random().toString(2).length
|
|
|
+// several times. If you only get numbers up to 34, you're fine.
|
|
|
+
|
|
|
+// 50 bits (18 from time, 32 random)
|
|
|
+// 10 characters
|
|
|
+// revolves appx every 4.4 minutes
|
|
|
+function quick32uid () {
|
|
|
+ var d = Date.now(), r = Math.random();
|
|
|
+ return (B4*((d&0x3ffff)+r)).toString(32);
|
|
|
+}
|
|
|
+
|
|
|
+// 73+ bits (41+ from time, 32 random)
|
|
|
+// 17+ characters
|
|
|
+// does not revolve
|
|
|
+// usable to sort by creation time
|
|
|
+// (lexically for at least 300 years, numerically forever)
|
|
|
+function full32uid () {
|
|
|
+ var d = Date.now(), r = Math.random(), rem = d % 8;
|
|
|
+ return ((d-rem)/8).toString(32)+(B4*(rem+r)).toString(32);
|
|
|
+}
|
|
|
+
|
|
|
+// 51.7 bits (19.7 from time, 32 random)
|
|
|
+// 10 characters
|
|
|
+// revolves appx every 14 minutes
|
|
|
+function quick36uid () {
|
|
|
+ var d = Date.now(), r = Math.random();
|
|
|
+ return (B4*((d%851265)+r)).toString(36);
|
|
|
+}
|
|
|
+
|
|
|
+// 73+ bits (41+ from time, 32 random)
|
|
|
+// 15+ characters
|
|
|
+// does not revolve, usable to sort by creation time
|
|
|
+// (lexically for at least 2500 years, numerically forever)
|
|
|
+function full36uid () {
|
|
|
+ var d = Date.now(), r = Math.random(), rem = d % 851265;
|
|
|
+ return ((d-rem)/851265+172000).toString(36)+(B4*((d%851265)+r)).toString(36);
|
|
|
+}
|
|
|
+
|
|
|
+// 48 bits (16 from time, 32 random)
|
|
|
+// 8 characters
|
|
|
+// revolves appx every minute
|
|
|
+function quick64uid () {
|
|
|
+ var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
|
|
|
+ d/B1, d, r/B3, r/B2, r/B1, r
|
|
|
+ ]);
|
|
|
+ return b.toString("base64");
|
|
|
+}
|
|
|
+
|
|
|
+// 72 bits (40 from time, 32 random)
|
|
|
+// 12 characters
|
|
|
+// revolves appx every 35 years (next revolution 7 Sep 2039)
|
|
|
+function medium64uid () {
|
|
|
+ var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
|
|
|
+ d/B4, d/B3, d/B2, d/B1, d, r/B3, r/B2, r/B1, r
|
|
|
+ ]);
|
|
|
+ return b.toString("base64");
|
|
|
+}
|
|
|
+
|
|
|
+// 96 bits (64 from time (not full precision), 32 random)
|
|
|
+// 16 characters
|
|
|
+// does not revolve, usable to sort by creation time
|
|
|
+function full64uid () {
|
|
|
+ var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
|
|
|
+ d/B7, d/B6, d/B5, d/B4, d/B3, d/B2, d/B1, d, r/B3, r/B2, r/B1, r
|
|
|
+ ]);
|
|
|
+ return b.toString("base64");
|
|
|
+}
|