4840

JavaScript でグローバルに一意の識別子を作成しようとしています。すべてのブラウザーでどのルーチンが利用できるか、組み込みの乱数ジェネレーターがどのように「ランダム」でシードされているかなどはわかりません。

GUID / UUID は少なくとも 32 文字である必要があり、それらを渡す際の問題を回避するために ASCII の範囲内にとどめる必要があります。

4

69 に答える 69

4973

[RFC4122準拠のUUIDを生成するための最新のベストプラクティスを反映するように2021-10-16を編集]

ここのほとんどの読者は、uuidモジュールを使用したいと思うでしょう。十分にテストされ、サポートされています。

この機能は、ブラウザの数が増えている中でサポートされcrypto.randomUUID()ている新しい標準です。Node.js

これらのどちらもうまくいかない場合は、次の方法があります(この質問に対する元の回答に基づく):

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

console.log(uuidv4());

注:ここで最もよく説明されている理由から、Math.random()に依存するUUIDジェネレーター使用は強くお勧めしません(この回答の以前のバージョンで紹介されたスニペットを含む)。TL; DR:Math.random()ベースのソリューションは、優れた一意性の保証を提供しません。

于 2010-01-22T13:40:20.003 に答える
2575

RFC 4122によるとGUID(Globally Unique IDentifier)とも呼ばれるUUID(Universally Unique IDentifier)は、特定の一意性を保証するように設計された識別子です。

数行のJavaScriptコードでRFC準拠のUUIDを実装することは可能ですが(たとえば、以下の@broofaの回答を参照)、いくつかの一般的な落とし穴があります。

  • 無効なID形式(UUIDは ""の形式である必要がありますxxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx。xは[0-9、af]のいずれかです。Mは[1-5]のいずれかであり、Nは[8、9、a、またはb]です。
  • ランダム性の低品質のソースの使用(などMath.random

したがって、本番環境用のコードを作成する開発者は、 uuidモジュールなどの厳密で適切に保守された実装を使用することをお勧めします。

于 2008-09-19T20:05:25.003 に答える
909

Broofa の答えがいかにきれいであるかは本当に気に入っていますが、実装が不十分Math.randomで衝突の可能性が残されているのは残念です。

これは、最初の 13 個の 16 進数をタイムスタンプの 16 進数部分でオフセットし、ページロードからマイクロ秒の 16 進数部分でオフセットを使い果たすことで、その問題を解決する同様のRFC4122バージョン 4 準拠のソリューションです。そうすればMath.random、同じシード上にある場合でも、両方のクライアントは、ページロードからまったく同じマイクロ秒数 (高パフォーマンス時間がサポートされている場合) で、まったく同じミリ秒 (または 10,000 年以上後) に UUID を生成する必要があります。同じ UUID を取得します。

function generateUUID() { // Public Domain/MIT
    var d = new Date().getTime();//Timestamp
    var d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16;//random number between 0 and 16
        if(d > 0){//Use timestamp until depleted
            r = (d + r)%16 | 0;
            d = Math.floor(d/16);
        } else {//Use microseconds since page-load if supported
            r = (d2 + r)%16 | 0;
            d2 = Math.floor(d2/16);
        }
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}

var onClick = function(){
    document.getElementById('uuid').textContent = generateUUID();
}
onClick();
#uuid { font-family: monospace; font-size: 1.5em; }
<p id="uuid"></p>
<button id="generateUUID" onclick="onClick();">Generate UUID</button>

ここにテストするフィドルがあります。


ES6 用に最新化されたスニペット

const generateUUID = () => {
  let
    d = new Date().getTime(),
    d2 = (performance && performance.now && (performance.now() * 1000)) || 0;
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
    let r = Math.random() * 16;
    if (d > 0) {
      r = (d + r) % 16 | 0;
      d = Math.floor(d / 16);
    } else {
      r = (d2 + r) % 16 | 0;
      d2 = Math.floor(d2 / 16);
    }
    return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
  });
};

const onClick = (e) => document.getElementById('uuid').textContent = generateUUID();

document.getElementById('generateUUID').addEventListener('click', onClick);

onClick();
#uuid { font-family: monospace; font-size: 1.5em; }
<p id="uuid"></p>
<button id="generateUUID">Generate UUID</button>

于 2012-01-10T19:38:54.400 に答える
182

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;
}
于 2009-05-17T03:39:23.657 に答える
100

これは、形式で最速の GUID のような文字列ジェネレーター メソッドですXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。標準準拠の GUID は生成されません。

この実装の 1,000 万回の実行にはわずか 32.5 秒しかかかりません。これは私がこれまでに見たブラウザーの中で最速です (ループ/反復のない唯一のソリューションです)。

関数は次のように単純です。

/**
 * Generates a GUID string.
 * @returns {string} The generated GUID.
 * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
 * @author Slavik Meltser.
 * @link http://slavik.meltser.info/?p=142
 */
function guid() {
    function _p8(s) {
        var p = (Math.random().toString(16)+"000000000").substr(2,8);
        return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
    }
    return _p8() + _p8(true) + _p8(true) + _p8();
}

パフォーマンスをテストするには、次のコードを実行できます。

console.time('t');
for (var i = 0; i < 10000000; i++) {
    guid();
};
console.timeEnd('t');

ほとんどの人は私がそこで何をしたかを理解していると確信していますが、説明が必要な人が少なくとも 1 人いるかもしれません。

アルゴリズム:

  • このMath.random()関数は、小数点以下 16 桁の 0 ~ 1 の 10 進数を返します (例: 0.4363923368509859)。
  • 次に、この数値を基数 16 の文字列に変換します (上の例では を取得します 0.6fb7687f)。 Math.random().toString(16).
  • 0.次に、プレフィックス ( 0.6fb7687f=> )を切り取り、6fb7687f16 進数 8 文字の長さの文字列を取得します。 (Math.random().toString(16).substr(2,8).
  • Math.random()最後のゼロが原因で、関数が短い数値 (たとえば ) を返す場合があります0.4363(上記の例では、実際の数値は です0.4363000000000000)。そのため、この文字列 (9 つのゼロを含む文字列) に追加し、関数"000000000"で切り取ってsubstr()正確に 9 文字にします (右にゼロを埋めます)。
  • 正確に 9 個のゼロを追加する理由は、関数が正確に 0 または 1 を返すという最悪のシナリオのためですMath.random()(それらのそれぞれについて 1/10^16 の確率)。そのため、ゼロを 9 つ追加し ("0"+"000000000"または"1"+"000000000")、8 文字の長さで 2 番目のインデックス (3 番目の文字) から切り取る必要がありました。残りのケースでは、ゼロを追加しても結果が損なわれることはありません。 Math.random().toString(16)+"000000000").substr(2,8).

アセンブリ:

  • GUID の形式は次のとおりですXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  • GUID を 4 つの部分に分割し、各部分を 2 つのタイプ (または形式) に分割しました:XXXXXXXX-XXXX-XXXX.
  • ここで、これら 2 つの型を使用して GUID を構築し、次のように 4 つの部分を呼び出して GUID を組み立てていますXXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX
  • これら 2 つのタイプを区別するために、フラグ パラメーターをペア クリエーター関数に追加しました_p8(s)。このsパラメーターは、ダッシュを追加するかどうかを関数に指示します。
  • 最終的に、次のチェーンで GUID を構築し、_p8() + _p8(true) + _p8(true) + _p8()それを返します。

私のブログのこの投稿へのリンク

楽しみ!:-)

于 2013-05-22T13:50:43.363 に答える
80

これは完全に非準拠ですが、ASCIIセーフなGUIDのような一意の識別子を生成するための非常にパフォーマンスの高い実装です。

function generateQuickGuid() {
    return Math.random().toString(36).substring(2, 15) +
        Math.random().toString(36).substring(2, 15);
}

26個の[a-z0-9]文字を生成し、RFC準拠のGUIDよりも短く一意のUIDを生成します。人間の読みやすさが重要な場合は、ダッシュを簡単に追加できます。

この関数の使用例とタイミング、およびこの質問の他の回答のいくつかを次に示します。タイミングはChromem25で実行され、それぞれ1,000万回の反復が行われました。

>>> generateQuickGuid()
"nvcjf1hs7tf8yyk4lmlijqkuo9"
"yq6gipxqta4kui8z05tgh9qeel"
"36dh5sec7zdj90sk2rx7pjswi2"
runtime: 32.5s

>>> GUID() // John Millikin
"7a342ca2-e79f-528e-6302-8f901b0b6888"
runtime: 57.8s

>>> regexGuid() // broofa
"396e0c46-09e4-4b19-97db-bd423774a4b3"
runtime: 91.2s

>>> createUUID() // Kevin Hakanson
"403aa1ab-9f70-44ec-bc08-5d5ac56bd8a5"
runtime: 65.9s

>>> UUIDv4() // Jed Schmidt
"f4d7d31f-fa83-431a-b30c-3e6cc37cc6ee"
runtime: 282.4s

>>> Math.uuid() // broofa
"5BD52F55-E68F-40FC-93C2-90EE069CE545"
runtime: 225.8s

>>> Math.uuidFast() // broofa
"6CB97A68-23A2-473E-B75B-11263781BBE6"
runtime: 92.0s

>>> Math.uuidCompact() // broofa
"3d7b7a06-0a67-4b67-825c-e5c43ff8c1e8"
runtime: 229.0s

>>> bitwiseGUID() // jablko
"baeaa2f-7587-4ff1-af23-eeab3e92"
runtime: 79.6s

>>>> betterWayGUID() // Andrea Turri
"383585b0-9753-498d-99c3-416582e9662c"
runtime: 60.0s

>>>> UUID() // John Fowler
"855f997b-4369-4cdb-b7c9-7142ceaf39e8"
runtime: 62.2s

これがタイミングコードです。

var r;
console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    r = FuncToTest(); 
};
console.timeEnd('t');
于 2012-11-15T18:04:57.513 に答える
70

sagi shkedyの技術ブログから:

function generateGuid() {
  var result, i, j;
  result = '';
  for(j=0; j<32; j++) {
    if( j == 8 || j == 12 || j == 16 || j == 20)
      result = result + '-';
    i = Math.floor(Math.random()*16).toString(16).toUpperCase();
    result = result + i;
  }
  return result;
}

ActiveXコントロールの使用を伴う他の方法もありますが、これらには近づかないでください。

GUIDジェネレーターが一意のキーを保証できないことを指摘する価値があると思いました(Wikipediaの記事を確認してください)。衝突の可能性は常にあります。GUIDは、衝突の変化をほぼゼロに減らすのに十分な大きさのキーのユニバースを提供するだけです。

于 2008-09-19T20:06:03.003 に答える
69

これは、最も投票された回答と、 Chrome の衝突の回避策の組み合わせです。

generateGUID = (typeof(window.crypto) != 'undefined' &&
                typeof(window.crypto.getRandomValues) != 'undefined') ?
    function() {
        // If we have a cryptographically secure PRNG, use that
        // https://stackoverflow.com/questions/6906916/collisions-when-generating-uuids-in-javascript
        var buf = new Uint16Array(8);
        window.crypto.getRandomValues(buf);
        var S4 = function(num) {
            var ret = num.toString(16);
            while(ret.length < 4){
                ret = "0"+ret;
            }
            return ret;
        };
        return (S4(buf[0])+S4(buf[1])+"-"+S4(buf[2])+"-"+S4(buf[3])+"-"+S4(buf[4])+"-"+S4(buf[5])+S4(buf[6])+S4(buf[7]));
    }

    :

    function() {
        // Otherwise, just use Math.random
        // https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
        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);
        });
    };

テストしたい場合は、jsbinにあります。

于 2011-12-12T10:13:24.253 に答える
54

node-uuidを使用できます。RFC4122 UUIDSのシンプルで高速な生成を提供します。

特徴:

  • RFC4122 バージョン 1 またはバージョン 4 UUID を生成する
  • Node.jsおよびブラウザーで実行されます。
  • サポートしているプラ​​ットフォームで暗号的に強力なランダム # 生成。
  • 小さなフットプリント (もっと小さいものをお探しですか?これをチェックしてください! )

NPM を使用してインストールします。

npm install uuid

または、ブラウザ経由で uuid を使用します。

Raw ファイル (uuid v1) をダウンロード: https://raw.githubusercontent.com/kelektiv/node-uuid/master/v1.js Raw ファイル (uuid v4) をダウンロード: https://raw.githubusercontent.com/kelektiv/node -uuid/master/v4.js


さらに小さくしたいですか?これをチェックしてください:https://gist.github.com/jed/982883


使用法:

// Generate a v1 UUID (time-based)
const uuidV1 = require('uuid/v1');
uuidV1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 UUID (random)
const uuidV4 = require('uuid/v4');
uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

// Generate a v5 UUID (namespace)
const uuidV5 = require('uuid/v5');

// ... using predefined DNS namespace (for domain names)
uuidV5('hello.example.com', v5.DNS)); // -> 'fdda765f-fc57-5604-a269-52a7df8164ec'

// ... using predefined URL namespace (for, well, URLs)
uuidV5('http://example.com/hello', v5.URL); // -> '3bbcee75-cecc-5b56-8031-b6641c1ed1f1'

// ... using a custom namespace
const MY_NAMESPACE = '(previously generated unique uuid string)';
uuidV5('hello', MY_NAMESPACE); // -> '90123e1c-7512-523e-bb28-76fab9f2f73d'

ECMAScript 2015 (ES6):

import uuid from 'uuid/v4';
const id = uuid();
于 2015-10-13T01:50:19.510 に答える
37
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 の回答と、バッファからニブル サイズのウィンドウを抽出するビット単位の演算子に基づいています。

RFC タイプ 4 (ランダム) スキーマに準拠する必要があります。前回、非準拠の UUID を Java の UUID で解析する際に問題があったためです。

于 2011-08-28T15:17:24.080 に答える
34

この質問の最良の回答の組み合わせとしての単純な JavaScript モジュール。

var crypto = window.crypto || window.msCrypto || null; // IE11 fix

var Guid = Guid || (function() {

  var EMPTY = '00000000-0000-0000-0000-000000000000';

  var _padLeft = function(paddingString, width, replacementChar) {
    return paddingString.length >= width ? paddingString : _padLeft(replacementChar + paddingString, width, replacementChar || ' ');
  };

  var _s4 = function(number) {
    var hexadecimalResult = number.toString(16);
    return _padLeft(hexadecimalResult, 4, '0');
  };

  var _cryptoGuid = function() {
    var buffer = new window.Uint16Array(8);
    crypto.getRandomValues(buffer);
    return [_s4(buffer[0]) + _s4(buffer[1]), _s4(buffer[2]), _s4(buffer[3]), _s4(buffer[4]), _s4(buffer[5]) + _s4(buffer[6]) + _s4(buffer[7])].join('-');
  };

  var _guid = function() {
    var currentDateMilliseconds = new Date().getTime();
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(currentChar) {
      var randomChar = (currentDateMilliseconds + Math.random() * 16) % 16 | 0;
      currentDateMilliseconds = Math.floor(currentDateMilliseconds / 16);
      return (currentChar === 'x' ? randomChar : (randomChar & 0x7 | 0x8)).toString(16);
    });
  };

  var create = function() {
    var hasCrypto = crypto != 'undefined' && crypto !== null,
      hasRandomValues = typeof(window.crypto.getRandomValues) != 'undefined';
    return (hasCrypto && hasRandomValues) ? _cryptoGuid() : _guid();
  };

  return {
    newGuid: create,
    empty: EMPTY
  };
})();

// DEMO: Create and show GUID
console.log('1. New Guid:   ' + Guid.newGuid());

// DEMO: Show empty GUID
console.log('2. Empty Guid: ' + Guid.empty);

使用法:

Guid.newGuid()

"c6c2d12f-d76b-5739-e551-07e6de5b0807"

Guid.empty

「00000000-0000-0000-0000-000000000000」

于 2013-02-02T15:27:06.797 に答える
34

これにより、バージョン 4 の UUID (疑似乱数から作成) が作成されます。

function uuid()
{
   var chars = '0123456789abcdef'.split('');

   var uuid = [], rnd = Math.random, r;
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
   uuid[14] = '4'; // version 4

   for (var i = 0; i < 36; i++)
   {
      if (!uuid[i])
      {
         r = 0 | rnd()*16;

         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
      }
   }

   return uuid.join('');
}

生成された UUID のサンプルを次に示します。

682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136
于 2009-08-24T16:12:46.980 に答える
27

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 の低いタイムスタンプの解像度は、乱数によって補われます。

于 2012-07-02T21:00:32.180 に答える
23
  // RFC 4122
  //
  // A UUID is 128 bits long
  //
  // String representation is five fields of 4, 2, 2, 2, and 6 bytes.
  // Fields represented as lowercase, zero-filled, hexadecimal strings, and
  // are separated by dash characters
  //
  // A version 4 UUID is generated by setting all but six bits to randomly
  // chosen values
  var uuid = [
    Math.random().toString(16).slice(2, 10),
    Math.random().toString(16).slice(2, 6),

    // Set the four most significant bits (bits 12 through 15) of the
    // time_hi_and_version field to the 4-bit version number from Section
    // 4.1.3
    (Math.random() * .0625 /* 0x.1 */ + .25 /* 0x.4 */).toString(16).slice(2, 6),

    // Set the two most significant bits (bits 6 and 7) of the
    // clock_seq_hi_and_reserved to zero and one, respectively
    (Math.random() * .25 /* 0x.4 */ + .5 /* 0x.8 */).toString(16).slice(2, 6),

    Math.random().toString(16).slice(2, 14)].join('-');
于 2010-07-14T23:30:52.323 に答える
17

速度を考慮したRFC 4122バージョン 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() );

上記の関数は、速度とランダム性のバランスが取れている必要があります。

于 2012-11-16T19:41:49.123 に答える
15

私は独自の UUID/GUID ジェネレーターをいくつかのエクストラで調整しましたhere .

次の 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));
于 2012-01-13T21:59:35.377 に答える
13

単一の16オクテットTypedArrayと.DataView

export const 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 data = crypto.getRandomValues(new Uint8Array(16)); /// Fill the buffer with random data
    data[6] = (data[6] & 0xf) | 0x40; /// Patch the 6th byte to reflect a version 4 UUID
    data[8] = (data[8] & 0x3f) | 0x80; /// Patch the 8th byte to reflect a variant 1 UUID (version 4 UUIDs are)
    const view = new DataView(data.buffer); /// Create a view backed by a 16-byte buffer
    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 プラットフォームで使用できる関数のみに依存しているため、私はそれを好みます。これはすべて 1 つの手順です。

これを書いている時点では、Node.jsgetRandomValuesのオブジェクトに対して実装されているものではありません。ただし、代わりに使用できるcrypto同等の機能があります。randomBytes

于 2018-12-11T11:39:53.927 に答える
13

より良い方法:

function(
  a, b               // Placeholders
){
  for(               // Loop :)
      b = a = '';    // b - result , a - numeric variable
      a++ < 36;      //
      b += a*51&52   // If "a" is not 9 or 14 or 19 or 24
                  ?  //  return a random number or 4
           (
               a^15              // If "a" is not 15,
                  ?              // generate a random number from 0 to 15
               8^Math.random() *
               (a^20 ? 16 : 4)   // unless "a" is 20, in which case a random number from 8 to 11,
                  :
               4                 //  otherwise 4
           ).toString(16)
                  :
         '-'                     //  In other cases, (if "a" is 9,14,19,24) insert "-"
      );
  return b
 }

最小化:

function(a,b){for(b=a='';a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'-');return b}
于 2012-05-23T18:42:35.067 に答える
13

特定の形式のランダムな 128 ビット文字列が必要な場合は、次を使用できます。

function uuid() {
    return crypto.getRandomValues(new Uint32Array(4)).join('-');
}

のようなものが返されます2350143528-4164020887-938913176-2513998651

于 2017-05-10T20:13:46.583 に答える
12

crypto.getRandomValues(a)以下は、サポートされているブラウザー(Internet Explorer 11 以降、iOS 7 以降、Firefox 21 以降、Chrome、および Android Chrome)で使用する簡単なコードです。

衝突を引き起こす可能性があるため、 の使用を避けますMath.random()(たとえば、Muxaによって実際の状況で生成された 4000 の UUID に対して 20 の衝突)。

function uuid() {
    function randomDigit() {
        if (crypto && crypto.getRandomValues) {
            var rands = new Uint8Array(1);
            crypto.getRandomValues(rands);
            return (rands[0] % 16).toString(16);
        } else {
            return ((Math.random() * 16) | 0).toString(16);
        }
    }

    var crypto = window.crypto || window.msCrypto;
    return 'xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx'.replace(/x/g, randomDigit);
}

ノート:

  • 速度ではなく、コードの読みやすさのために最適化されているため、たとえば、1 秒あたり数百の UUID に適しています。パフォーマンスを測定するためにhttp://jsbin.com/fuwigo/1を使用して、ラップトップの Chromium で毎秒約 10000 uuid() を生成します。
  • コードを読みやすくするために、「y」には8のみを使用します (y は89A、またはBにすることができます)。
于 2015-06-03T00:58:45.677 に答える
12

環境が SharePoint の場合、SP.Guid.newGuid(新しい GUID を作成するMSDN リンクと呼ばれるユーティリティ関数があります。この関数は sp.init.js ファイル内にあります。この関数を書き直すと (他のプライベート関数から他の依存関係を削除するため)、次のようになります。

var newGuid = function () {
    var result = '';
    var hexcodes = "0123456789abcdef".split("");

    for (var index = 0; index < 32; index++) {
        var value = Math.floor(Math.random() * 16);

        switch (index) {
        case 8:
            result += '-';
            break;
        case 12:
            value = 4;
            result += '-';
            break;
        case 16:
            value = value & 3 | 8;
            result += '-';
            break;
        case 20:
            result += '-';
            break;
        }
        result += hexcodes[value];
    }
    return result;
};
于 2013-06-12T16:00:03.247 に答える
11

これは日付に基づいており、一意性を「確保」するためにランダムな接尾辞を追加します。

これは 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;
        };
于 2014-03-06T11:34:54.647 に答える
5

npm パッケージguid、GUID ジェネレーターおよびバリデーターを使用できます。

例:

Guid.raw();
// -> '6fdf6ffc-ed77-94fa-407e-a7b86ed9e59d'

注:このパッケージは廃止されました。代わりにuuidを使用してください。

例:

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'
于 2015-10-27T08:33:01.007 に答える
4

一意の ID を生成する簡単なソリューションは、タイム トークンを使用し、それに乱数を追加することです。「uuid-」を前に付けることを好みます。

以下の関数はタイプのランダムな文字列を生成します: uuid-14d93eb1b9b4533e6 . 32 文字のランダムな文字列を生成する必要はありません。この場合、JavaScript で一意の UUID を提供するには、16 文字のランダムな文字列で十分です。

var createUUID = function() {
  return "uuid-" + ((new Date).getTime().toString(16) + Math.floor(1E7*Math.random()).toString(16));
}
于 2015-05-27T06:00:57.927 に答える
4

以下の関数を使用しています。

function NewGuid()
{
    var sGuid = "";
    for (var i=0; i<32; i++)
    {
        sGuid += Math.floor(Math.random()*0xF).toString(0xF);
    }
    return sGuid;
}
于 2014-04-04T07:13:34.660 に答える
3

ここでは、 UUID を生成する非常に小さな関数を見つけることができます。

最終バージョンの 1 つは次のとおりです。

function b(
  a                  // Placeholder
){
  var cryptoObj = window.crypto || window.msCrypto; // For Internet Explorer 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
      )
}
于 2016-10-16T04:44:00.943 に答える
3

このスクリプトは、JavaScript で GUID を作成するのに役立つことがわかりました

https://github.com/addui/GUIDJS

var myGuid = GUID();
于 2016-08-11T18:15:36.707 に答える
3

Google に立ち寄った人が小さなユーティリティ ライブラリを探している場合に備えて、ShortIdはこの質問のすべての要件を満たしています。許可された文字と長さを指定でき、連続していない、繰り返されていない文字列を保証します。

これをより現実的な答えにするために、そのライブラリのコアは次のロジックを使用して短い ID を生成します。

function encode(lookup, number) {
    var loopCounter = 0;
    var done;

    var str = '';

    while (!done) {
        str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );
        done = number < (Math.pow(16, loopCounter + 1 ) );
        loopCounter++;
    }
    return str;
}

/* Generates the short id */
function generate() {

    var str = '';

    var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);

    if (seconds === previousSeconds) {
        counter++;
    } else {
        counter = 0;
        previousSeconds = seconds;
    }

    str = str + encode(alphabet.lookup, version);
    str = str + encode(alphabet.lookup, clusterWorkerId);
    if (counter > 0) {
        str = str + encode(alphabet.lookup, counter);
    }
    str = str + encode(alphabet.lookup, seconds);

    return str;
}

このアプローチの最も基本的な部分のみを反映するようにこれを編集していないため、上記のコードにはライブラリからの追加ロジックが含まれています。それが行っていることすべてに興味がある場合は、ソースを見てください: https://github.com/dylang/shortid/tree/master/lib

于 2016-02-01T16:26:08.150 に答える
2

私のユースケースでは、グローバルに一意であることが保証された ID 生成が必要でした。例外なく。私はしばらくこの問題に取り組み、 TUID (真にユニークな ID)と呼ばれる解決策を思いつきました。最初の 32 文字がシステムによって生成され、残りの数字がエポックからのミリ秒を表す ID を生成します。クライアント側の JavaScript コードで ID を生成する必要がある状況では、うまく機能します。

于 2014-06-08T13:30:08.520 に答える
1

事実上、Microsoft 以外のサークルでは UUID と呼ばれる GUID は、128 ビットの暗号乱数であり、UUID バージョン番号 (1 ~ 5) は固定位置バイトにあります。

したがって、0 から 65535 までの一連の乱数を生成し、それらを 16 進数でエンコードすると、次のようになります。

function guid()
{
    function s4()
    {
        return Math.floor(Math.random() * 65536).toString(16).padStart(4, '0')
    } // End Function s4

    return s4() + s4() + '-' + s4() + '-' + "4" + s4().substr(1) + '-' + s4() + '-' + s4() + s4() + s4();
} // End Function guid

有効な GUID を取得しますが、ランダムな実装のため、暗号的に安全ではありません。

暗号的に安全な GUID を生成するには、window.crypto (または Internet Explorer の場合は window.msCrypto) を使用する必要があります。

それは次のようになります。

function cryptGuid()
{
    var array = new Uint16Array(8);
    (window.crypto || window.msCrypto).getRandomValues(array);
    var dataView = new DataView(array.buffer);

    var parts = [];

    for(var i = 0; i < array.length; ++i)
    {
        // 0&1,2,3,4,5-7 dataView.getUint16(0-7)
        if(i>1 && i<6) parts.push("-");
        parts.push(dataView.getUint16(i).toString(16).padStart(4, '0'));
    }

    parts[5] = "4" + parts[5].substr(1);
    // console.log(parts);
    return parts.join('').toUpperCase();// .toLowerCase();
}

cryptGuid();

さらに、数字を小文字または大文字の文字列として返すかどうかを決定する必要があります。一部のソフトウェアでは小文字が必要ですが (Reporting Service など)、大文字を生成するソフトウェア (SQL Server など) もあります。

于 2020-09-17T13:38:00.903 に答える
0
function randomHex(length) {
    var random_string = '';
    if(!length){
        length = 1;
    }
    for(var i=0; i<length; i+=1){
        random_string += Math.floor(Math.random() * 15).toString(16);
    }
    return random_string;
}

function guid() {
    return randomHex(8);
}
于 2016-09-07T08:47:35.730 に答える
0

シンプルな uuid パッケージで簡単に https://www.npmjs.com/package/uuid

const { v4: uuidv4 } = require('uuid');
uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
于 2022-02-07T07:46:11.503 に答える