在JavaScript中创建GUID / UUID?
我试图在JavaScript中创建全局唯一标识符。 我不确定在所有浏览器上都有哪些例程可用,如何“随机”并播种内置的随机数生成器等等。
GUID / UUID应至少为32个字符,并应保留在ASCII范围内以避免在传递时遇到麻烦。
这方面曾有过几次尝试。 问题是:你想要实际的GUID,还是只是看起来像GUID的随机数字? 生成随机数很容易。
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
但是请注意,这些值不是真正的GUID 。
没有办法在Javascript中生成真正的GUID,因为它们取决于浏览器不公开的本地计算机的属性。 您需要使用特定于操作系统的服务,如ActiveX:http://p2p.wrox.com/topicindex/20339.htm
编辑:不正确 - RFC4122允许随机(“版本4”)GUID。 查看其他答案的细节。
注意 :提供的代码片段不遵循RFC4122,它要求版本( 4
)必须集成到生成的输出字符串中。 如果您需要合规的GUID,请不要使用此答案 。
使用:
var uuid = guid();
演示:
function guid() {
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
}
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
document.getElementById('jsGenId').addEventListener('click', function() {
document.getElementById('jsIdResult').value = guid();
})
input { font-family: monospace; }
<button id="jsGenId" type="button">Generate GUID</button>
<br>
<input id="jsIdResult" type="text" placeholder="Results will be placed here..." readonly size="40"/>
对于符合RFC4122版本4的解决方案,这种单线(ish)解决方案是我能想到的最紧凑的解决方案。
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
console.log(uuidv4())
我真的很喜欢Broofa的答案,但不幸的是, Math.random
糟糕实现会让我们碰撞。
这里有一个类似的RFC4122版本4兼容解决方案,通过将时间戳的十六进制部分抵消前13个十六进制数来解决这个问题。 这样,即使Math.random
在同一个种子上,两个客户端也必须在完全相同的毫秒(或者超过10,000年以后)生成UUID才能获得相同的UUID:
function generateUUID() { // Public Domain/MIT
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
这是一个小提琴来测试。
上一篇: Create GUID / UUID in JavaScript?
下一篇: Proper use cases for Android UserManager.isUserAGoat()?