mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
(function() {
|
|
/*
|
|
* Generate a RFC4122(v4) UUID
|
|
*
|
|
* Documentation at https://github.com/broofa/node-uuid
|
|
*/
|
|
|
|
// Use node.js Buffer class if available, otherwise use the Array class
|
|
var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array;
|
|
|
|
// Buffer used for generating string uuids
|
|
var _buf = new BufferClass(16);
|
|
|
|
// Cache number <-> hex string for octet values
|
|
var toString = [];
|
|
var toNumber = {};
|
|
for (var i = 0; i < 256; i++) {
|
|
toString[i] = (i + 0x100).toString(16).substr(1);
|
|
toNumber[toString[i]] = i;
|
|
}
|
|
|
|
function parse(s) {
|
|
var buf = new BufferClass(16);
|
|
var i = 0, ton = toNumber;
|
|
s.toLowerCase().replace(/[0-9a-f][0-9a-f]/g, function(octet) {
|
|
buf[i++] = toNumber[octet];
|
|
});
|
|
return buf;
|
|
}
|
|
|
|
function unparse(buf) {
|
|
var tos = toString, b = buf;
|
|
return tos[b[0]] + tos[b[1]] + tos[b[2]] + tos[b[3]] + '-' +
|
|
tos[b[4]] + tos[b[5]] + '-' +
|
|
tos[b[6]] + tos[b[7]] + '-' +
|
|
tos[b[8]] + tos[b[9]] + '-' +
|
|
tos[b[10]] + tos[b[11]] + tos[b[12]] +
|
|
tos[b[13]] + tos[b[14]] + tos[b[15]];
|
|
}
|
|
|
|
var b32 = 0x100000000, ff = 0xff;
|
|
function uuid(fmt, buf, offset) {
|
|
var b = fmt != 'binary' ? _buf : (buf ? buf : new BufferClass(16));
|
|
var i = buf && offset || 0;
|
|
|
|
var r = Math.random()*b32;
|
|
b[i++] = r & ff;
|
|
b[i++] = r>>>8 & ff;
|
|
b[i++] = r>>>16 & ff;
|
|
b[i++] = r>>>24 & ff;
|
|
r = Math.random()*b32;
|
|
b[i++] = r & ff;
|
|
b[i++] = r>>>8 & ff;
|
|
b[i++] = r>>>16 & 0x0f | 0x40; // See RFC4122 sect. 4.1.3
|
|
b[i++] = r>>>24 & ff;
|
|
r = Math.random()*b32;
|
|
b[i++] = r & 0x3f | 0x80; // See RFC4122 sect. 4.4
|
|
b[i++] = r>>>8 & ff;
|
|
b[i++] = r>>>16 & ff;
|
|
b[i++] = r>>>24 & ff;
|
|
r = Math.random()*b32;
|
|
b[i++] = r & ff;
|
|
b[i++] = r>>>8 & ff;
|
|
b[i++] = r>>>16 & ff;
|
|
b[i++] = r>>>24 & ff;
|
|
|
|
return fmt === undefined ? unparse(b) : b;
|
|
};
|
|
|
|
uuid.parse = parse;
|
|
uuid.unparse = unparse;
|
|
uuid.BufferClass = BufferClass;
|
|
|
|
if (typeof(module) != 'undefined') {
|
|
module.exports = uuid;
|
|
} else {
|
|
// In browser? Set as top-level function
|
|
this.uuid = uuid;
|
|
}
|
|
})();
|
|
|