Browse Source

Added file with uid generators.

Herbert Vojčík 13 years ago
parent
commit
26caf6b28b
1 changed files with 76 additions and 0 deletions
  1. 76 0
      uid-gens.js

+ 76 - 0
uid-gens.js

@@ -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");
+}