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

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


当前回答

这个是基于日期,并添加一个随机的补充到“保证”的独特性。

它很好地用于CSS识别器,总是返回类似的东西,并且很容易被黑客攻击:

uid-139410573297741

var getUniqueId = function (prefix) {
            var d = new Date().getTime();
            d += (parseInt(Math.random() * 100)).toString();
            if (undefined === prefix) {
                prefix = 'uid-';
            }
            d = prefix + d;
            return d;
        };

其他回答

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。

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

import * as crypto from "crypto";

const uuid = crypto.randomUUID();

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

只是另一个更可读的变量,只有两个突变。

function uuid4()
{
  function hex (s, b)
  {
    return s +
      (b >>> 4   ).toString (16) +  // high nibble
      (b & 0b1111).toString (16);   // low nibble
  }

  let r = crypto.getRandomValues (new Uint8Array (16));

  r[6] = r[6] >>> 4 | 0b01000000; // Set type 4: 0100
  r[8] = r[8] >>> 3 | 0b10000000; // Set variant: 100

  return r.slice ( 0,  4).reduce (hex, '' ) +
         r.slice ( 4,  6).reduce (hex, '-') +
         r.slice ( 6,  8).reduce (hex, '-') +
         r.slice ( 8, 10).reduce (hex, '-') +
         r.slice (10, 16).reduce (hex, '-');
}

这也适用于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

易于使用一个简单的 uuid 包 https://www.npmjs.com/package/uuid

const { v4: uuidv4 } = require('uuid');
uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'