Uuid.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. module.exports = {
  2. createUUID: function () {
  3. var _self = this;
  4. // Loose interpretation of the specification DCE 1.1: Remote Procedure Call
  5. // since JavaScript doesn't allow access to internal systems, the last 48 bits
  6. // of the node section is made up using a series of random numbers (6 octets long).
  7. //
  8. var dg = new Date(1582, 10, 15, 0, 0, 0, 0);
  9. var dc = new Date();
  10. var t = dc.getTime() - dg.getTime();
  11. var tl = _self.getIntegerBits(t, 0, 31);
  12. var tm = _self.getIntegerBits(t, 32, 47);
  13. var thv = _self.getIntegerBits(t, 48, 59) + '1'; // version 1, security version is 2
  14. var csar = _self.getIntegerBits(_self.rand(4095), 0, 7);
  15. var csl = _self.getIntegerBits(_self.rand(4095), 0, 7);
  16. // since detection of anything about the machine/browser is far to buggy,
  17. // include some more random numbers here
  18. // if NIC or an IP can be obtained reliably, that should be put in
  19. // here instead.
  20. var n = _self.getIntegerBits(_self.rand(8191), 0, 7) +
  21. _self.getIntegerBits(_self.rand(8191), 8, 15) +
  22. _self.getIntegerBits(_self.rand(8191), 0, 7) +
  23. _self.getIntegerBits(_self.rand(8191), 8, 15) +
  24. _self.getIntegerBits(_self.rand(8191), 0, 15); // this last number is two octets long
  25. return tl + tm + thv + csar + csl + n;
  26. },
  27. //Pull out only certain bits from a very large integer, used to get the time
  28. //code information for the first part of a UUID. Will return zero's if there
  29. //aren't enough bits to shift where it needs to.
  30. getIntegerBits: function (val, start, end) {
  31. var base16 = this.returnBase(val, 16);
  32. var quadArray = new Array();
  33. var quadString = '';
  34. var i = 0;
  35. for (i = 0; i < base16.length; i++) {
  36. quadArray.push(base16.substring(i, i + 1));
  37. }
  38. for (i = Math.floor(start / 4); i <= Math.floor(end / 4); i++) {
  39. if (!quadArray[i] || quadArray[i] == '')
  40. quadString += '0';
  41. else
  42. quadString += quadArray[i];
  43. }
  44. return quadString;
  45. },
  46. //Replaced from the original function to leverage the built in methods in
  47. //JavaScript. Thanks to Robert Kieffer for pointing this one out
  48. returnBase: function (number, base) {
  49. return (number).toString(base).toUpperCase();
  50. },
  51. //pick a random number within a range of numbers
  52. //int b rand(int a); where 0 <= b <= a
  53. rand: function (max) {
  54. return Math.floor(Math.random() * (max + 1));
  55. },
  56. }