[Javascript] UUID generator

Daniel Berlin mail at daniel-berlin.de
Thu Jul 6 05:17:32 CDT 2006


Hi list,
here's my UUID class.
Comments / additions / whatever please:

--- snip ---

/* Generate a new universally unique identifier (UUID) according to RFC 
4122.
 * Returns the string representation of the UUID as defined in section 3 
of RFC 4122.
 *   (type) - The type of UUID to generate: "v4" (default) or "NIL"
 */
UUID = {
    generate: function (type) {
        switch ((type || 'v4').toUpperCase ()) {
            // Version 4 UUID  (Section 4.4 of RFC 4122)
            case 'V4':
                var tl    = this._randomHexString (8);                  
// time_low
                var tm    = this._randomHexString (4);                  
// time_mid
                var thav  = '4' + this._randomHexString (3);            
// time_hi_and_version
                var cshar = Math.randomInt (0, 0xFF);                   
// clock_seq_hi_and_reserved
                    cshar = ((cshar & ~(1 << 6)) | (1 << 7)).toString (16);
                var csl   = this._randomHexString (2);                  
// clock_seq_low
                var n     = this._randomHexString (12);                 
// node

                return (tl + '-' + tm + '-' + thav + '-' + cshar + csl + 
'-' + n);

            // Nil UUID  (Section 4.1.7 of RFC 4122)
            case 'NIL':
                return ('00000000-0000-0000-0000-000000000000');
        }
        return (null);
    },

    _randomHexString: function (len) {
        var random = Math.randomInt (0, Math.pow (16, len) - 1);
        return (random.toString (16).pad (len, '0', String.PAD_LEFT));
    }
}

/* Pad a string to a certain length with another string; similar to 
PHP's str_pad() function.
 * Derived from code by Carlos Reche <carlosreche at yahoo.com>.
 *    len   - Pad the string up to this length
 *   (pad)  - String used for padding (default: a single space)
 *   (type) - Type can be String.PAD_LEFT, String.PAD_RIGHT (default) or 
String.PAD_BOTH
 */
String.PAD_LEFT  = 0;
String.PAD_RIGHT = 1;
String.PAD_BOTH  = 2;

String.prototype.pad = function (len, pad, type) {
    var string = this;
    var append = new String ();

    len = isNaN (len) ? 0 : len - string.length;
      pad = typeof (pad) == 'string' ? pad : ' ';

      if (type == String.PAD_BOTH) {
        string = string.pad (Math.floor (len / 2) + string.length, pad, 
String.PAD_LEFT);
        return (string.pad (Math.ceil  (len / 2) + string.length, pad, 
String.PAD_RIGHT));
      }

      while ((len -= pad.length) > 0)
        append += pad;
      append += pad.substr (0, len + pad.length);

      return (type == String.PAD_LEFT ? append.concat (string) : 
string.concat (append));
}

/* Generate a uniformly distributed random integer within the range 
<min> .. <max>.
 *   (min) - Lower limit: random >= min (default: 0)
 *   (max) - Upper limit: random <= max (default: 1)
 */
Math.randomInt = function (min, max) {
    if (! isFinite (min)) min = 0;
    if (! isFinite (max)) max = 1;
    return (Math.floor ((Math.random () % 1) * (max - min + 1) + min));
}

alert ("UUID v4: " + UUID.generate ("v4") + "\nNil UUID: " + 
UUID.generate("nil"));

--- snap ---

Regards,
Daniel Berlin




More information about the Javascript mailing list