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