如何在JavaScript中创建GUID(全球独特识别器)?GUID/UUID应该至少有32个字符,并且应该保持在ASCII范围内,以避免在通过它们时遇到麻烦。

我不确定在所有浏览器上有哪些习惯,如何“随机”和种植内置的随机号码发电机等。


当前回答

var uuid = function() {
    var buf = new Uint32Array(4);
    window.crypto.getRandomValues(buf);
    var idx = -1;
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        idx++;
        var r = (buf[idx>>3] >> ((idx%8)*4))&15;
        var v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
};

这个版本是基于Briguy37的答案和一些Bitwise运营商从泡沫中提取Nibble大小的窗户。

它应该遵守RFC类型4(随机)方案,因为我上次遇到麻烦与Java的UUID不符合的UUID。

其他回答

最简单的功能来做到这一点:

function createGuid(){  
   let S4 = () => Math.floor((1+Math.random())*0x10000).toString(16).substring(1); 
   let guid = `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
   
   return guid.toLowerCase();  
}

原始 URL.createObjectURL 正在产生 UUID. 您可以利用此。

function uuid() {
  const url = URL.createObjectURL(new Blob())
  const [id] = url.toString().split('/').reverse()
  URL.revokeObjectURL(url)
  return id
}

添加到: v15.6.0, v14.17.0 有一个内置的 crypto.randomUUID() 函数。

import * as crypto from "crypto";

const uuid = crypto.randomUUID();

在浏览器中,crypto.randomUUID() 目前支持 Chromium 92+ 和 Firefox 95+。

这也适用于Node.js,如果您更换了Let Buffer = 新 Uint8Array(); crypto.getRandomValues 与Let Buffer = crypto.randomBytes(16)

它应该在性能中打击最常见的表达解决方案。

const hex = '0123456789ABCDEF' let generateToken = function() { let buffer = new Uint8Array(16) crypto.getRandomValues(buffer) buffer[6] = 0x40 (buffer[6] & 0xF) buffer[8] = 0x80 (buffer[8] & 0xF) let segments = [] for (let i = 0; i < 16; ++i) { segments.push(hex[(buffer[i] >> 4 & 0xF)]) segments.push(hex[(buffer[i] >> 0 & 0xF)])) if (i ==

表演图(每个人都喜欢它们):JSbench

ES6 样品

const guid=()=> {
  const s4=()=> Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);     
  return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`;
}