/**
* Generates IDs.
* @name IDGenerator
* @namespace
* @private
*/
define(["lib/underscore"], function(_) {
"use strict";
var uuidFormat = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
var traceIdFormat = "xxxxxxxxxxxxxxxxxxxxxy==";
// return true iff the given character is a valid lowercase hex caracter
var isHexC = function(c) {
return (/^[0-9a-f]$/).test(c);
};
var base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64TwoBits = "AQgw";
var IDGenerator = /** @lends IDGenerator */ {
/**
* Returns a random UUID.
* @return {String}
*/
uuid: function() {
// from http://stackoverflow.com/a/2117523
return uuidFormat.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c === "x" ? r : (r&0x3|0x8);
return v.toString(16);
});
},
/**
* Return true iff the given string is a uuid.
*/
isUUID: function(str) {
if(str.length !== uuidFormat.length) {
return false;
}
return _.every(uuidFormat, function(c, i) {
var testC = str[i];
if(c === "x" || c === "y") {
return isHexC(testC);
}
else if(c === "-") {
return (testC === "-");
}
else if(c === "4") {
return (testC === "4");
}
});
},
/**
* Generates a random trace id.
* @return {String} the trace id.
*/
traceId: function() {
return traceIdFormat.replace(/x/g, function() {
return base64[Math.random()*64|0];
}).replace(/y/g, function() {
return base64TwoBits[Math.random()*4|0];
});
}
};
return IDGenerator;
});