Создать GUID / UUID в JavaScript? - PullRequest
       583

Создать GUID / UUID в JavaScript?

3682 голосов
/ 20 сентября 2008

Я пытаюсь создать глобально уникальные идентификаторы в JavaScript. Я не уверен, какие подпрограммы доступны во всех браузерах, насколько «случайным» и затравленным является встроенный генератор случайных чисел и т. Д.

Значение GUID / UUID должно быть не менее 32 символов и должно оставаться в диапазоне ASCII, чтобы избежать проблем при их передаче.

Ответы [ 53 ]

2 голосов
/ 01 января 2018

Для тех, кто использует Javascript в Windows (например, WScript / CScript / MSHTA). Можно использовать ActiveX. В частности, объект Scriptlet.Typelib:

WScript.Echo((new ActiveXObject("Scriptlet.TypeLib")).Guid)

Обратите внимание, что этот ответ работает только с перечисленными технологиями, он не будет работать ни с одним браузером, даже с Microsoft Edge! Таким образом, ваш пробег будет зависеть от этого ответа.

1 голос
/ 18 января 2019

ОК, используя пакет uuid , он поддерживает UUID версии 1, 3, 4 и 5 do:

yarn add uuid

и затем:

const uuidv1 = require('uuid/v1');
uuidv1(); // ⇨ '45745c60-7b1a-11e8-9c9c-2d42b21b1a3e'

Вы также можете сделать это с помощью полностью определенных опций:

const v1options = {
  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678
};
uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab'

Для получения дополнительной информации посетите страницу npm здесь

1 голос
/ 27 мая 2015

Простым решением для генерации уникальной идентификации является использование токена времени и добавление к нему случайного числа. Я предпочитаю использовать префикс "uuid-".

Ниже функция сгенерирует случайную строку типа: uuid-14d93eb1b9b4533e6 . Не нужно генерировать 32 символа случайной строки. В этом случае более 16 символов случайной строки более чем достаточно для предоставления уникальных UUID в javascript.

var createUUID = function() {
  return"uuid-"+((new Date).getTime().toString(16)+Math.floor(1E7*Math.random()).toString(16));
}
1 голос
/ 16 октября 2016

Здесь вы можете найти очень маленькую функцию, которая генерирует uuids https://gist.github.com/jed/982883

Одна из окончательных версий:

function b(
  a                  // placeholder
){
  var cryptoObj = window.crypto || window.msCrypto; // for IE 11
  return a           // if the placeholder was passed, return
    ? (              // a random number from 0 to 15
      a ^            // unless b is 8,
      cryptoObj.getRandomValues(new Uint8Array(1))[0]  // 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
      )
}
0 голосов
/ 18 марта 2019

Мы можем использовать replace и crypto.getRandomValues, чтобы получить вывод, подобный этому:

xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx

enter image description here

Если мы ищем оптимальное решение, мы должны заменить crypto.getRandomValues(new Uint8Array(1))[0] на массив (32).

const uuidv4 = () =>
  ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  );

console.log(uuidv4());

Чтобы получить этот код:

function uuidv4() {
  let bytes = window.crypto.getRandomValues(new Uint8Array(32));
  const randomBytes = () => (bytes = bytes.slice(1)) && bytes[0];

  return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => 
      (c ^ randomBytes() & 15 >> c / 4).toString(16)
    );
}


for (var i = 0; i < 10; i++)
  console.log(uuidv4());

Столкновение:

Мы можем сделать как Google Analytics и добавить отметку времени с: uuidv4() + "." + (+new Date()).

0 голосов
/ 11 декабря 2018

Я не смог найти ответа, который бы использовал один 16-октетный TypedArray и DataView, поэтому я думаю, что следующее решение для генерации UUID версии 4 на , на котором будет стоять RFC здесь свое:

function uuid4() {
    const ho = (n, p) => n.toString(16).padStart(p, 0); /// Return the hexadecimal text representation of number `n`, padded with zeroes to be of length `p`
    const view = new DataView(new ArrayBuffer(16)); /// Create a view backed by a 16-byte buffer
    crypto.getRandomValues(new Uint8Array(view.buffer)); /// Fill the buffer with random data
    view.setUint8(6, (view.getUint8(6) & 0xf) | 0x40); /// Patch the 6th byte to reflect a version 4 UUID
    view.setUint8(8, (view.getUint8(8) & 0x3f) | 0x80); /// Patch the 8th byte to reflect a variant 1 UUID (version 4 UUIDs are)
    return `${ho(view.getUint32(0), 8)}-${ho(view.getUint16(4), 4)}-${ho(view.getUint16(6), 4)}-${ho(view.getUint16(8), 4)}-${ho(view.getUint32(10), 8)}${ho(view.getUint16(14), 4)}`; /// Compile the canonical textual form from the array data
}

Я предпочитаю, потому что он опирается только на функции, доступные для стандартной платформы ECMAScript.

Обратите внимание на тот факт, что на момент написания этого getRandomValues не было реализовано для объекта crypto в Node.js. Однако он имеет функцию randomBytes.

0 голосов
/ 30 ноября 2018

для науки. Я еще не видел, чтобы кто-то делал это ... он не соответствует v4, но его можно легко изменить. Это просто пример расширения типа Uint8Array и использования crypto.getRandomValues ​​() для генерации значений байтов uuid.

class uuid extends Uint8Array {
        constructor() {
            super(16)
            /* not v4, just some random bytes */
            window.crypto.getRandomValues(this)
        }
        toString() {
            let id = new String()
            for (let i = 0; i < this.length; i++) {
                /*convert uint8 to hex string */
                let hex = this[i].toString(16).toUpperCase()

                /*add zero padding*/
                while (hex.length < 2) {
                    hex = String(0).concat(hex)
                }
                id += hex

                /* add dashes */
                if (i == 4 || i == 6 || i == 8 || i == 10 || i == 16){
                    id += '-'
                }
            }
            return id
        }
    }
0 голосов
/ 16 июля 2018

Я понял, что это старый вопрос, но я узнал кое-что новое несколько дней назад, и я думаю, что это хорошее место, чтобы «поделиться» им:

Используя Change.js , вы получаете уникальный GUID с одной строкой кода:

var chance = new Chance();

document.body.innerHTML = chance.guid();
body { font-family: Tahoma }
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Chance.js</title>
</head>
<body>
<script src="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
<link href="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css" rel="stylesheet" type="text/css" />
  <script src="http://chancejs.com/chance.min.js"></script>
</body>
</html>
0 голосов
/ 04 февраля 2011

Я знаю, что эта тема старая, но если вы действительно хотите создать GUID, вы можете сделать это без явного JavaScript. Вы можете вызвать истечение срока действия страницы при каждой загрузке и создать GUID на стороне сервера, а затем заполнить его в переменной javascript во время выполнения страницы. Просто идея.

0 голосов
/ 14 августа 2015

Просто подумал, что опубликую еще один способ сделать то же самое.

function guid() {
  var chars = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
  var str = "";
  for(var i=0;i<36;i++) {
    var str = str + ((i == 8 || i == 13 || i == 18 || i == 23) ? "-" : chars[Math.floor(Math.random()*chars.length)]);
  };
  return str;
}
...