我正在尝试在JavaScript中创建全局唯一标识符。我不确定所有浏览器上都提供哪些例程,内置随机数生成器的“随机性”和种子的播种方式等等。
GUID / UUID至少应包含32个字符,并且应保持在ASCII范围内,以免在传递它们时遇到麻烦。
我正在尝试在JavaScript中创建全局唯一标识符。我不确定所有浏览器上都提供哪些例程,内置随机数生成器的“随机性”和种子的播种方式等等。
GUID / UUID至少应包含32个字符,并且应保持在ASCII范围内,以免在传递它们时遇到麻烦。
对于那些希望与rfc4122版本4兼容的解决方案并考虑速度的人(对Math.random()的调用很少):
var rand = Math.random;
function UUID() {
var nbr, randStr = "";
do {
randStr += (nbr = rand()).toString(16).substr(3, 6);
} while (randStr.length < 30);
return (
randStr.substr(0, 8) + "-" +
randStr.substr(8, 4) + "-4" +
randStr.substr(12, 3) + "-" +
((nbr*4|0)+8).toString(16) + // [89ab]
randStr.substr(15, 3) + "-" +
randStr.substr(18, 12)
);
}
console.log( UUID() );
以上功能应在速度和随机性之间取得适当的平衡。
GitHub上的JavaScript项目-https: //github.com/LiosK/UUID.js
UUID.js JavaScript的RFC兼容UUID生成器。
参见RFC 4122 http://www.ietf.org/rfc/rfc4122.txt。
功能生成符合RFC 4122的UUID。
提供版本4 UUID(来自随机数的UUID)和版本1 UUID(基于时间的UUID)。
UUID对象允许对UUID的各种访问,包括对UUID字段的访问。
JavaScript的低时间戳分辨率可以通过随机数来补偿。
调整了我自己的UUID / GUID生成器,并在此处添加了一些其他功能。
我正在使用以下Kybos随机数生成器,使其在密码学上更加合理。
下面是我的脚本,其中排除了baagoe.com的Mash和Kybos方法。
//UUID/Guid Generator
// use: UUID.create() or UUID.createSequential()
// convenience: UUID.empty, UUID.tryParse(string)
(function(w){
// From http://baagoe.com/en/RandomMusings/javascript/
// Johannes Baagøe <baagoe@baagoe.com>, 2010
//function Mash() {...};
// From http://baagoe.com/en/RandomMusings/javascript/
//function Kybos() {...};
var rnd = Kybos();
//UUID/GUID Implementation from http://frugalcoder.us/post/2012/01/13/javascript-guid-uuid-generator.aspx
var UUID = {
"empty": "00000000-0000-0000-0000-000000000000"
,"parse": function(input) {
var ret = input.toString().trim().toLowerCase().replace(/^[\s\r\n]+|[\{\}]|[\s\r\n]+$/g, "");
if ((/[a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12}/).test(ret))
return ret;
else
throw new Error("Unable to parse UUID");
}
,"createSequential": function() {
var ret = new Date().valueOf().toString(16).replace("-","")
for (;ret.length < 12; ret = "0" + ret);
ret = ret.substr(ret.length-12,12); //only least significant part
for (;ret.length < 32;ret += Math.floor(rnd() * 0xffffffff).toString(16));
return [ret.substr(0,8), ret.substr(8,4), "4" + ret.substr(12,3), "89AB"[Math.floor(Math.random()*4)] + ret.substr(16,3), ret.substr(20,12)].join("-");
}
,"create": function() {
var ret = "";
for (;ret.length < 32;ret += Math.floor(rnd() * 0xffffffff).toString(16));
return [ret.substr(0,8), ret.substr(8,4), "4" + ret.substr(12,3), "89AB"[Math.floor(Math.random()*4)] + ret.substr(16,3), ret.substr(20,12)].join("-");
}
,"random": function() {
return rnd();
}
,"tryParse": function(input) {
try {
return UUID.parse(input);
} catch(ex) {
return UUID.empty;
}
}
};
UUID["new"] = UUID.create;
w.UUID = w.Guid = UUID;
}(window || this));
Web服务将很有用。
快速的Google发现:http : //www.hoskinson.net/GuidGenerator/
无法保证该实现,但是SOMEONE必须发布真实的GUID生成器。
使用这种Web服务,您可以开发一个REST Web界面,该界面使用GUID Web服务,并通过AJAX将其提供给浏览器中的javascript。
这是日期为2011年10月9日的解决方案,来自用户jed在https://gist.github.com/982883的评论:
UUIDv4 = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}
这可以实现与当前最高评分答案相同的目标,但是通过利用强制,递归和指数表示法,可以减少50个字节以内。对于那些好奇它如何工作的人,下面是该函数较旧版本的带注释形式:
UUIDv4 =
function b(
a // placeholder
){
return a // if the placeholder was passed, return
? ( // a random number from 0 to 15
a ^ // unless b is 8,
Math.random() // in which case
* 16 // a random number from
>> a/4 // 8 to 11
).toString(16) // in hexadecimal
: ( // or otherwise a concatenated string:
[1e7] + // 10000000 +
-1e3 + // -1000 +
-4e3 + // -4000 +
-8e3 + // -80000000 +
-1e11 // -100000000000,
).replace( // replacing
/[018]/g, // zeroes, ones, and eights with
b // random hex digits
)
}
这是一些基于RFC 4122第4.4节(从真正随机数或伪随机数创建UUID的算法)的代码。
function createUUID() {
// http://www.ietf.org/rfc/rfc4122.txt
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
}
根据RFC 4122,UUID(通用唯一IDentifier)也称为GUID(全局唯一IDentifier)是具有一定唯一性保证的标识符。
生成它们的最好方法是遵循上述RFC中的实现说明,使用许多社区审核的开源实现之一。
node-uuid是一种流行的用于在JavaScript中使用UUID的开源工具。
请注意,仅随机生成标识符(逐字节或逐字符)将不会为您提供与一致实现相同的保证。同样,非常重要的是,使用兼容的UUID的系统可能会选择不接受随机生成的UUID,并且许多开源验证程序实际上会检查有效的结构。
UUID必须具有以下格式:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
其中M和N位置可能只有某些值。此时,M的唯一有效值为1、2、3、4和5,因此随机生成该位置将使大多数结果不可接受。
ES6 sample