uid-gens.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const B1 = 0x100, B2 = B! * B1, B3 = B2 * B1, B4 = B3 * B1,
  2. B5 = B4 * B1, B6 = B5 * B1, B7 = B6 * B1;
  3. // All the function silently assume that Math.random() has 32 bit precision,
  4. // that is, B4*Math.random() is integer.
  5. // This holds at the time of writing for v8, thus for node.js.
  6. // If it does not hold for you, you must update the code to truncate where needed.
  7. // To test if this holds for you, try to print out
  8. // Math.random().toString(2).length
  9. // several times. If you only get numbers up to 34, you're fine.
  10. // 50 bits (18 from time, 32 random)
  11. // 10 characters
  12. // revolves appx every 4.4 minutes
  13. function quick32uid () {
  14. var d = Date.now(), r = Math.random();
  15. return (B4*((d&0x3ffff)+r)).toString(32);
  16. }
  17. // 73+ bits (41+ from time, 32 random)
  18. // 17+ characters
  19. // does not revolve
  20. // usable to sort by creation time
  21. // (lexically for at least 300 years, numerically forever)
  22. function full32uid () {
  23. var d = Date.now(), r = Math.random(), rem = d % 8;
  24. return ((d-rem)/8).toString(32)+(B4*(rem+r)).toString(32);
  25. }
  26. // 51.7 bits (19.7 from time, 32 random)
  27. // 10 characters
  28. // revolves appx every 14 minutes
  29. function quick36uid () {
  30. var d = Date.now(), r = Math.random();
  31. return (B4*((d%851265)+r)).toString(36);
  32. }
  33. // 73+ bits (41+ from time, 32 random)
  34. // 15+ characters
  35. // does not revolve, usable to sort by creation time
  36. // (lexically for at least 2500 years, numerically forever)
  37. function full36uid () {
  38. var d = Date.now(), r = Math.random(), rem = d % 851265;
  39. return ((d-rem)/851265+172000).toString(36)+(B4*((d%851265)+r)).toString(36);
  40. }
  41. // 48 bits (16 from time, 32 random)
  42. // 8 characters
  43. // revolves appx every minute
  44. function quick64uid () {
  45. var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
  46. d/B1, d, r/B3, r/B2, r/B1, r
  47. ]);
  48. return b.toString("base64");
  49. }
  50. // 72 bits (40 from time, 32 random)
  51. // 12 characters
  52. // revolves appx every 35 years (next revolution 7 Sep 2039)
  53. function medium64uid () {
  54. var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
  55. d/B4, d/B3, d/B2, d/B1, d, r/B3, r/B2, r/B1, r
  56. ]);
  57. return b.toString("base64");
  58. }
  59. // 96 bits (64 from time (not full precision), 32 random)
  60. // 16 characters
  61. // does not revolve, usable to sort by creation time
  62. function full64uid () {
  63. var d = Date.now(), r = B4 * Math.random(), b = new Buffer([
  64. d/B7, d/B6, d/B5, d/B4, d/B3, d/B2, d/B1, d, r/B3, r/B2, r/B1, r
  65. ]);
  66. return b.toString("base64");
  67. }