在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);
    });
}


这是一个小提琴来测试。

链接地址: http://www.djcxy.com/p/317.html

上一篇: Create GUID / UUID in JavaScript?

下一篇: Proper use cases for Android UserManager.isUserAGoat()?