在JavaScript中创建GUID / UUID?

我正在尝试在JavaScript中创建全局唯一标识符。我不确定所有浏览器上都提供哪些例程,内置随机数生成器的“随机性”和种子的播种方式等等。

GUID / UUID至少应包含32个字符,并且应保持在ASCII范围内,以免在传递它们时遇到麻烦。

猪猪JinJin西里2020/03/09 12:45:25

ES6 sample

const guid=()=> {
  const s4=()=> Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);     
  return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`;
}
Pro小卤蛋2020/03/09 12:45:25

对于那些希望与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() );

以上功能应在速度和随机性之间取得适当的平衡。

番长神无2020/03/09 12:45:25

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的低时间戳分辨率可以通过随机数来补偿。

TomGreen2020/03/09 12:45:25

调整了我自己的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));
SamStafan十三2020/03/09 12:45:25

Web服务将很有用。

快速的Google发现:http : //www.hoskinson.net/GuidGenerator/

无法保证该实现,但是SOMEONE必须发布真实的GUID生成器。

使用这种Web服务,您可以开发一个REST Web界面,该界面使用GUID Web服务,并通过AJAX将其提供给浏览器中的javascript。

逆天路易2020/03/09 12:45:25

这是日期为2011年10月9日的解决方案,来自用户jedhttps://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
      )
}
乐十三2020/03/09 12:45:25

这是一些基于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;
}
JimNear2020/03/09 12:45:25

根据RFC 4122UUID(通用唯一IDentifier)也称为GUID(全局唯一IDentifier)是具有一定唯一性保证的标识符。

生成它们的最好方法是遵循上述RFC中的实现说明,使用许多社区审核的开源实现之一。

node-uuid是一种流行的用于在JavaScript中使用UUID的开源工具。

请注意,仅随机生成标识符(逐字节或逐字符)将不会为您提供与一致实现相同的保证。同样,非常重要的是,使用兼容的UUID的系统可能会选择不接受随机生成的UUID,并且许多开源验证程序实际上会检查有效的结构。

UUID必须具有以下格式:

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

其中MN位置可能只有某些值。此时,M的唯一有效值为1、2、3、4和5,因此随机生成该位置将使大多数结果不可接受。