Skip to content

Instantly share code, notes, and snippets.

@nuintun
Last active June 6, 2016 06:10
Show Gist options
  • Select an option

  • Save nuintun/1e382bb08fa493435bc7 to your computer and use it in GitHub Desktop.

Select an option

Save nuintun/1e382bb08fa493435bc7 to your computer and use it in GitHub Desktop.
GUID生成
// GUID
Math.trueRandom = (function (){
  if (crypto.getRandomValues) {
    // if we have a crypto library, use it
    return function (){
      var array = new Uint32Array(1);
      
      crypto.getRandomValues(array);
      
      var intVal = array[0];
      
      return intVal / (Math.pow(10, (intVal + '').length));
    };
  } else {
    // From http://baagoe.com/en/RandomMusings/javascript/
    // Johannes Baagøe <[email protected]>, 2010
    function Mash(){
      var n = 0xefc8249d;

      var mash = function (data){
        data = data.toString();
      
        for (var i = 0; i < data.length; i++) {
          n += data.charCodeAt(i);
      
          var h = 0.02519603282416938 * n;
      
          n = h >>> 0;
          h -= n;
          h *= n;
          n = h >>> 0;
          h -= n;
          n += h * 0x100000000; // 2^32
        }
      
        return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
      };

      mash.version = 'Mash 0.9';
      
      return mash;
    }

    // From http://baagoe.com/en/RandomMusings/javascript/
    function Alea(){
      return (function (args){
        // Johannes Baagøe <[email protected]>, 2010
        var s0 = 0;
        var s1 = 0;
        var s2 = 0;
        var c = 1;

        if (args.length == 0) {
          args = [+new Date()];
        }
      
        var mash = Mash();
      
        s0 = mash(' ');
        s1 = mash(' ');
        s2 = mash(' ');

        for (var i = 0; i < args.length; i++) {
          s0 -= mash(args[i]);
      
          if (s0 < 0) {
            s0 += 1;
          }
      
          s1 -= mash(args[i]);
      
          if (s1 < 0) {
            s1 += 1;
          }
      
          s2 -= mash(args[i]);
      
          if (s2 < 0) {
            s2 += 1;
          }
        }
      
        mash = null;

        var random = function (){
          var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
      
          s0 = s1;
          s1 = s2;
      
          return s2 = t - (c = t | 0);
        };
      
        random.uint32 = function (){
          return random() * 0x100000000; // 2^32
        };
      
        random.fract53 = function (){
          return random() +
            (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
        };
      
        random.version = 'Alea 0.9';
        random.args = args;
        
        return random;

      }(Array.prototype.slice.call(arguments)));
    };
    
    return Alea();
  }
}());

Math.guid = function (){
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c){
    var r = Math.trueRandom() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
    
    return v.toString(16);
  });
};

参考:
How to create a GUID / UUID in Javascript?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment