質問
私が作り出してしまおうというもののグローバル独自の識別子を設定していますお使いいただくことによってルーチンは、すべてのブラウザ、どのように"ランダム"および播種の乱数ジェネレータです。
にガイド/UUIDが、少なくとも32文字をASCII範囲なトラブルが引き継いでいくことです。
解決
Uuid(普遍的でユニークな識別子)としても知られる特別な技術を必要と(グローバル固有の識別子)によると、 RFC4122, は、識別子の一定の独自性を保証するものではあ
最良の方法で作成し、続実施を指示したRFCは、多くの地域吟味されたオープンソースの実装方法です。
人気のオープンソースのツールとUuid当サイトでは、以下のブラウザ ノード-uuid
注するだけでランダムに生成の識別子のバイトをバイトは、文字による文字のない同一の保証として不適合の実装です。また、非常に重要なシステムと対応のUuidを選択なランダムに生成されたものであり、さらに多くのオープンソースのvalidatorが実際にチェックのための有効な構造です。
は、UUIDはこのフォーマット:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
の M や N 職てもらうようにしてください一定の値です。この時のみ有効な値にMを1、2、3、4、5、ランダムに発生する位置にいかせるよう結果を受け入れられない。
他のヒント
のため RFC4122 4版準拠した溶液に、このライナー(ish)のソリューションには、最もコンパクトように。:
function uuidv4() {
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);
});
}
console.log(uuidv4())
更新2015-06-02:このUUIDの独自性を大きく依存して元の乱数ジェネレータ(RNG).の溶液を上記の利用 Math.random()
簡潔、しかし Math.random()
は ない 保証する高品質RNG.参照アダム-ハイランドの 優れたwriteupにMath.random() ます。より強固なソリューションが考えよう uuidはモジュール【特記事項:私の著]を使用する高品質RNGのApiが利用可能。
更新2015-08-26:としての側面においては、そ 概要 について説明している多くの図書館名でIdを利用申請でき発生する前にある確率のもとで衝突.例えば、3.26x1015 バージョン4RFC4122Uuidい1-in-a---百万円百万円百万の衝突.
更新2017-06-28:A 良い記事からクロムの開発 議論の状態Math.ランダムPRNG質Chrome、Firefox、Safari.tl;dr-下旬-2015では"良い"な暗号ます。ること、こちらのバージョンアップされた上記の溶液を使用するES6の crypto
API、 ビJS wizardyい信:
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());
いかにクリーン Broofaの回答 でも残念ながら、貧困の実装 Math.random
休暇のための衝突.
ここで類似している RFC4122 4版準拠を解決する問題相殺することにより、第13六角数字による六角部分にタイムスタンプ.その場合でも、 Math.random
同種、お客様というのUUIDのミリ秒(または10,000年以降になりましたが、同じUUID:
function generateUUID() { // Public Domain/MIT
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
broofaの答えはきわめきある印象的な、...rfc4122対応やや読み取り、コンパクトです。高!
だがその正規表現を、多くの replace()
コールバック、 toString()
's Math.random()
機能の呼び出したのだけを4ビットの結果を無駄に使が起きる可能性があるかもしれない。実際、joelptも決定した投げ出RFCのための汎用ガイド速度 generateQuickGUID
.
ができるまでの速度 や RFCコンプライアンスとはなんというか、有! 能を維持していま読みや?しかし---だが、その場でフォローしています。
しかし、最初に、私の結果と比較しbroofa, guid
の受け入れで解答)、非rfcに準拠した generateQuickGuid
:
Desktop Android
broofa: 1617ms 12869ms
e1: 636ms 5778ms
e2: 606ms 4754ms
e3: 364ms 3003ms
e4: 329ms 2015ms
e5: 147ms 1156ms
e6: 146ms 1035ms
e7: 105ms 726ms
guid: 962ms 10762ms
generateQuickGuid: 292ms 2961ms
- Note: 500k iterations, results will vary by browser/cpu.
なので私の第6回繰り返し処理の最適化を行いビートで最も人気の回答による 12倍, の受け答えによる 9X, を高速-非対応答えによる 2-3倍.やってるやつばっかしだrfc4122に対応しています。
に興味はいかがですか?ぐらさんさんのフル-ソースに http://jsfiddle.net/jcward/7hyaC/3/ や http://jsperf.com/uuid-generator-opt/4
について説明しましょう始まbroofaのコード:
'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);
});
で置き換え x
他のランダム六角数字、 y
ランダムなデータを除く強制的にトップ2ビット 10
をRFCスペック)の正規表現と一致しない -
または 4
文字そのものだなっています。非常にタイムには満足している。
最初に知る機能通話にも、正規表現をもった個1では32コールバックなので、試合では、それぞれのに32コールバックが呼びかけられていMath.random()ウェブサイト上のコンテンツtoString(16)).
最初のステップに向けての性能を正規表現とそのコールバック機能と、簡単なループです。することこそ、重要であり、これは -
や 4
文字はbroofaっていません。また、使用できるStringの配列インデックスしている場合であっても、スリックの文字列テンプレートの建築
function e1() {
var u='',i=0;
while(i++<36) {
var c='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'[i-1],r=Math.random()*16|0,v=c=='x'?r:(r&0x3|0x8);
u+=(c=='-'||c=='4')?c:v.toString(16)
}
return u;
}
基本的には同じ内部ロジックを除き、またチェック -
または 4
, 法を用いながらループの代わりに replace()
コールバック)が、ほぼ3倍改善!
次のステップには小さなデスクトップになっていますが、このワ差のモバイルコンテンツです。くろが少なMath.ランダム()の呼び出し、活用すべてのランダムビットの代わりに投げ87%の持ち出すことにランダムバッファを取得する移ってそれぞれになります。まもとテンプレート定義のループなどの場合です:
function e2() {
var u='',m='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',i=0,rb=Math.random()*0xffffffff|0;
while(i++<36) {
var c=m[i-1],r=rb&0xf,v=c=='x'?r:(r&0x3|0x8);
u+=(c=='-'||c=='4')?c:v.toString(16);rb=i%8==0?Math.random()*0xffffffff|0:rb>>4
}
return u
}
この縮に10~30%によります。います。が、次の大きなステップとなく、toStringの機能を完全にと最適化の定番の見ものである。簡単に16の要素をルックアップテーブルを行なう能力と資格を有する者を仕事のtoString(16)にも時間:
function e3() {
var h='0123456789abcdef';
var k='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
/* same as e4() below */
}
function e4() {
var h=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
var k=['x','x','x','x','x','x','x','x','-','x','x','x','x','-','4','x','x','x','-','y','x','x','x','-','x','x','x','x','x','x','x','x','x','x','x','x'];
var u='',i=0,rb=Math.random()*0xffffffff|0;
while(i++<36) {
var c=k[i-1],r=rb&0xf,v=c=='x'?r:(r&0x3|0x8);
u+=(c=='-'||c=='4')?c:h[v];rb=i%8==0?Math.random()*0xffffffff|0:rb>>4
}
return u
}
次の最適化は別のクラシック。まだコースの取扱いを4ビットの出力は各ループの繰り返しましょうカットの数を半分程は8ビット毎になります。これは難しいのRFC準拠のビット位置ができます。そしてより大きなルックアップテーブル(16x16、256)納0x00-0xff、構築いたしますので一度だけ、外部のe5系()機能です。
var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }
function e5() {
var k=['x','x','x','x','-','x','x','-','4','x','-','y','x','-','x','x','x','x','x','x'];
var u='',i=0,rb=Math.random()*0xffffffff|0;
while(i++<20) {
var c=k[i-1],r=rb&0xff,v=c=='x'?r:(c=='y'?(r&0x3f|0x80):(r&0xf|0x40));
u+=(c=='-')?c:lut[v];rb=i%4==0?Math.random()*0xffffffff|0:rb>>8
}
return u
}
また、e6()このプロセスは16ビットの同時使用は、256要素のLUT、この縮小を返しますの最適化。ものの、少なく繰り返し、内部ロジックした複雑な増加による処理が行われ、デスクトップのみ~10%より速いモバイルコンテンツです。
最終的な最適化手法の適用-unrollのループを実行します。まだループを一定回数まで、技術的に書きとしています。やってみると一度に一つのランダム変数rがんの再割り当て、性暴落しました。ものつの変数を割り当てランダムなデータフロントのルックアップテーブルには適切なRFCビット単位のこのバージョン煙と同時に、それら全て
var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }
function e7()
{
var d0 = Math.random()*0xffffffff|0;
var d1 = Math.random()*0xffffffff|0;
var d2 = Math.random()*0xffffffff|0;
var d3 = Math.random()*0xffffffff|0;
return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
}
Modualized: http://jcward.com/UUID.js - UUID.generate()
面白いのは、16バイトのランダムなデータは簡単な部分だ。全体のトリックを表現することがで文字列形式のRFCコンプライアンスというよう厳重に達成16バイトのランダムなデータは、丸められないループおよびルックアップ。
どうぞよろしくお願いいたし理論が正しい--でも、間違いのないようにこのような面倒なビットがたくさんありました。その成果を見ています。私はあなたにぴったりの楽しみのこのmadをバーコード最適化!
ご了承: 私の主な目的とした英会話教室可能性の最適化戦略に関するその他の回答をカバーなどが重要な研究課題などの衝突真の乱数、重要な発生いUuid.
こちらは一部のコードに基づく RFC4122, 第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;
}
var uniqueId = Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);
場合はIDの発生以上1ミリ秒から100%ます。
の場合はIDの生成がもっと短い間隔で、この方法は、この生IDの99.99999999999999%るにとどまらず、これまで世界をリードするユニークな衝突1 10^15)
ことで増やすことができ数による桁が生100%独自のIDが必要となります。
ればならないかもしれませんが必要RFCの遵守、このフォーマットは、有効なバージョン4ガイド:
const uid = (new Date()).getTime().toString(16) + Math.random().toString(16).substring(2) + "0".repeat(16);
const guid = uid.substr(0,8) + '-' + uid.substr(8,4) + '-4000-8' + uid.substr(12,3) + '-' + uid.substr(15,12);
var u = (new Date()).getTime().toString(16) +
Math.random().toString(16).substring(2) + "0".repeat(16);
var guid = u.substr(0,8) + '-' + u.substr(8,4) + '-4000-8' +
u.substr(12,3) + '-' + u.substr(15,12);
document.getElementById("unique").innerHTML = guid;
<div id="unique">
</div>
編集:上記のコードの意図ではなく文字は、RFC.その他の違いで複数の乱数。(追加の乱数が必要な場合での上振れることは本当に速いのに比べて100%に準拠します。ができ 存分に試すこちら
最速のことのように文字列発電方法の形式 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
.これは発生しない標準に準拠したこと.
万死刑執行のこの実装はわずか32.5秒、最速からのブラウザの唯一のソリューションなループ/反復回数).
に機能しています:
/**
* Generates a GUID string.
* @returns {String} The generated GUID.
* @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
* @author Slavik Meltser (slavik@meltser.info).
* @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');
んで参りますので、ご理解の程、何かあったか、ん、ありがとうございまは少なくとも一人が必要説明:
のアルゴリズム
- の
Math.random()
機能を返します十進数0と1の間に16桁の数字の後に小数点数の点( 例0.4363923368509859
). - そしてこの番号に変換
で文字列のベース16日から上記の例は、ま
0.6fb7687f
).
Math.random().toString(16)
. - その切の
0.
接頭辞(0.6fb7687f
=>6fb7687f
)および文字列で取得します八進数 文字の長さです。
(Math.random().toString(16).substr(2,8)
. - たまには
Math.random()
機能に戻ります 短縮番号(例えば0.4363
によりゼロの末から上記の例は、実際にその数は0.4363000000000000
).提案したいと考えてい追加がこの文字列"000000000"
(文字列析とゼロ)を切断でsubstr()
機能と九字を正確に(充填零点を右)。 - その理由を正確に分析ゼロにできるようになるため、その最悪シナリオの
Math.random()
機能に戻り正確に0または1つの確率1/10^16れました。それを追加するのに必要四頭("0"+"000000000"
または"1"+"000000000"
しっからのindex(3文字)と長さの文字です。その他の場合はゼロになるので切れます。
Math.random().toString(16)+"000000000").substr(2,8)
.
組立には:
- のことでは以下の形式で与えらる。
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
. - 分割したとのことで4個、各分けて2つの種類又は形式):
XXXXXXXX
や-XXXX-XXXX
. - 現在私のガイドを使用これらの2種類を組み立てガイドと呼4個、
XXXXXXXX
-XXXX-XXXX
-XXXX-XXXX
XXXXXXXX
. - るとは異なる可能性がある二つの種類になっていたため、フラグパラメータがペアで作機能
_p8(s)
, は、s
パラメータは機能かどうかの追加ダッシュです。 - 最終的に構築いたしますとのことで以下のチェーン:
_p8() + _p8(true) + _p8(true) + _p8()
, 、その要素を返します。
楽しめます!:-)
こちらを組み合わせに トップ投票の回答, し、回避策のための クロームの衝突:
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 だいたいとしていたことが分かりました。
こちらは完全に非対応が非常にperformant実施を生成するアスキー-安全ガイド-のように独自の識別子です。
function generateQuickGuid() {
return Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
}
生成26za-z0-9]文字の結果UIDが短く、ユニークなRFC準拠した特別な技術を必要と.ダッシュできtriviallyが追加されていれば人間-可読性に関する
ここで使用例およびタイミングのためこの機能は、この問題の答えなのです。のタイミングを行った下でのクロムm25は、10百万円を繰り返します。
>>> 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');
この溶液に付け。9、2011年からのコメントによるユーザー jed 時 https://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
)
}
から 鷺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コントロールが離れるのはこちら。
編集: と思った値になっていると指摘しないことで発電機を保証する独自のキー(チェックインの wikipedia記事).あの衝突.ることだけでは十分な大きさの宇宙のキーの削減への変更は、衝突のほとんど無料。
利用できるノード-uuid(https://github.com/kelektiv/node-uuid)
簡単に高速生成 RFC4122 UUID.
特徴:
- 生RFC4122バージョン1、バージョン4Uuid
- 走node.js およびブラウザを推奨いたします。
- 暗号法論的には強ランダム#代を担う世代に向けた支援す。
- 小さなフットプリント(たいかい小さいのか? チェックします。)
NPMインストール:
npm install uuid
使用uuid経由でブラウザ:
ダウンロードファイル(uuid v1): https://raw.githubusercontent.com/kelektiv/node-uuid/master/v1.js ダウンロードファイル(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'
ES6:
import uuid from 'uuid/v4';
const id = uuid();
Webサービスが役立ちます。
早Google見つかり: http://www.hoskinson.net/GuidGenerator/
でん太鼓判を押す実績ありこの実装では、人が開発bonafideことで機能します。
そのようなwebサービスのう休ウェブ-インターフェースを消費することでwebサービス、itを通じてAJAXト、ブラウザです。
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の答えとビット単位で事業者の抽出nibbleサイズの窓からのバッファです。
きを遵守し、RFCタイプ4(ランダム)スキーマ、また前回の解析には非対応uuid JavaのUUID.
簡単な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);
window.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(Guid.newGuid());
使用量:
Guid.newGuid()
"c6c2d12f-d76b-5739-e551-07e6de5b0807"
Guid.空
"00000000-0000-0000-0000-000000000000"
から good ol'wikipedia あへのリンクjavascriptの実施UUID.
でかなりの優雅なきも改善される塩とハッシュ、クライアントのIPアドレスです。このハッシュだといえるでしょう挿入されたhtmlドキュメントサーバ側での使用により、クライアント側です。
更新:元のサイトはシャッフルで、こちらではの 更新版
でも、このチの答えですが、残念ながらありませんが"true"のランダムにたくさん。の版下記を適broofaの答えが、更に"true"のランダム機能を使用する暗号化図書館利用できる場合は、アリアア()関数としてフォールバック.
Math.log2 = Math.log2 || function(n){ return Math.log(n) / Math.log(2); }
Math.trueRandom = (function() {
var crypt = window.crypto || window.msCrypto;
if (crypt && crypt.getRandomValues) {
// if we have a crypto library, use it
var random = function(min, max) {
var rval = 0;
var range = max - min;
if (range < 2) {
return min;
}
var bits_needed = Math.ceil(Math.log2(range));
if (bits_needed > 53) {
throw new Exception("We cannot generate numbers larger than 53 bits.");
}
var bytes_needed = Math.ceil(bits_needed / 8);
var mask = Math.pow(2, bits_needed) - 1;
// 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111
// Create byte array and fill with N random numbers
var byteArray = new Uint8Array(bytes_needed);
crypt.getRandomValues(byteArray);
var p = (bytes_needed - 1) * 8;
for(var i = 0; i < bytes_needed; i++ ) {
rval += byteArray[i] * Math.pow(2, p);
p -= 8;
}
// Use & to apply the mask and reduce the number of recursive lookups
rval = rval & mask;
if (rval >= range) {
// Integer out of acceptable range
return random(min, max);
}
// Return an integer that falls within the range
return min + rval;
}
return function() {
var r = random(0, 1000000000) / 1000000000;
return r;
};
} else {
// From http://baagoe.com/en/RandomMusings/javascript/
// Johannes Baagøe <baagoe@baagoe.com>, 2010
function Mash() {
var n = 0xefc8249d;
var mash = function(data) {
data = data.toString();
for (var i = 0; i < data.length; i++) {
n += data.charCodeAt(i);
var h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000; // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
};
mash.version = 'Mash 0.9';
return mash;
}
// From http://baagoe.com/en/RandomMusings/javascript/
function Alea() {
return (function(args) {
// Johannes Baagøe <baagoe@baagoe.com>, 2010
var s0 = 0;
var s1 = 0;
var s2 = 0;
var c = 1;
if (args.length == 0) {
args = [+new Date()];
}
var mash = Mash();
s0 = mash(' ');
s1 = mash(' ');
s2 = mash(' ');
for (var i = 0; i < args.length; i++) {
s0 -= mash(args[i]);
if (s0 < 0) {
s0 += 1;
}
s1 -= mash(args[i]);
if (s1 < 0) {
s1 += 1;
}
s2 -= mash(args[i]);
if (s2 < 0) {
s2 += 1;
}
}
mash = null;
var random = function() {
var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
s0 = s1;
s1 = s2;
return s2 = t - (c = t | 0);
};
random.uint32 = function() {
return random() * 0x100000000; // 2^32
};
random.fract53 = function() {
return random() +
(random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
};
random.version = 'Alea 0.9';
random.args = args;
return random;
}(Array.prototype.slice.call(arguments)));
};
return Alea();
}
}());
Math.guid = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.trueRandom() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
};
このバージョン4UUIDに作成されますから擬似乱数):
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('');
}
こちらのログインidとパスワードのUuidの生成:
682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136
JavaScriptのプロジェクトGitHub- https://github.com/LiosK/UUID.js
UUID.js のRFC準拠のUUIDジェネレータです。
見RFC4122 http://www.ietf.org/rfc/rfc4122.txt.
の特徴を生成し、RFC4122対応Uuid.
バージョン4Uuid(Uuidからランダム番号とバージョン1Uuid (時間的-Uuid)があります。
UUIDオブジェクトでは様々なアクセスのUUIDを含むアクセス UUIDます。
低タイムスタンプ分解能のJavaScriptによるランダム ます。
// 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('-');
調整後自分のUUID/GUID発電機がエキストラ こちらの.
を使用してい 以下のKybos 乱数ジェネレータをビットより得ます。
以下が私のスクリプトにマッシュとKybos法baagoe.com を除きます。
//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));
のよりよい方法:
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
? // genetate 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}
たいと思った理解broofaの答えいに拡大しています。追加コメント:
var uuid = function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
/[xy]/g,
function (match) {
/*
* Create a random nibble. The two clever bits of this code:
*
* - Bitwise operations will truncate floating point numbers
* - For a bitwise OR of any x, x | 0 = x
*
* So:
*
* Math.random * 16
*
* creates a random floating point number
* between 0 (inclusive) and 16 (exclusive) and
*
* | 0
*
* truncates the floating point number into an integer.
*/
var randomNibble = Math.random() * 16 | 0;
/*
* Resolves the variant field. If the variant field (delineated
* as y in the initial string) is matched, the nibble must
* match the mask (where x is a do-not-care bit):
*
* 10xx
*
* This is achieved by performing the following operations in
* sequence (where x is an intermediate result):
*
* - x & 0x3, which is equivalent to x % 3
* - x | 0x8, which is equivalent to x + 8
*
* This results in a nibble between 8 inclusive and 11 exclusive,
* (or 1000 and 1011 in binary), all of which satisfy the variant
* field mask above.
*/
var nibble = (match == 'y') ?
(randomNibble & 0x3 | 0x8) :
randomNibble;
/*
* Ensure the nibble integer is encoded as base 16 (hexadecimal).
*/
return nibble.toString(16);
}
);
};
ES6サンプル
const guid=()=> {
const s4=()=> Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`;
}
すだけのシンプルなAJAXコー---
人がいれば、とても興味があり、こちらの私。
サーバ側:
[WebMethod()]
public static string GenerateGuid()
{
return Guid.NewGuid().ToString();
}
クライアント側:
var myNewGuid = null;
PageMethods.GenerateGuid(
function(result, userContext, methodName)
{
myNewGuid = result;
},
function()
{
alert("WebService call failed.");
}
);
希望される方は、rfc4122 4版準拠の解速度の考察(数呼Math.random()):
function UUID() {
var nbr, randStr = "";
do {
randStr += (nbr = Math.random()).toString(16).substr(2);
} 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)
].join("");
}
上記の機能が必要らしいバランス速度および乱数の発生.
これに基づき、追加のランダム接尾辞に"""ユニークさ、などの点です。も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;
};
いことを義務付けられている.で、その完全性、環境がSharePointが公機能と呼ばれるもの SP.Guid.newGuid
(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;
};
あるjQueryプラグインを取り扱うことのく@ http://plugins.jquery.com/project/GUID_Helper
jQuery.Guid.Value()
値を返します内部のガイド.ない場合にはガイドが指定されていた、新しい値は、内部に格納されます).
jQuery.Guid.New()
新たに追加されたことで、セット値を内蔵しています。
jQuery.Guid.Empty()
を返す空のガイド00000000-0000-0000-0000-000000000000.
jQuery.Guid.IsEmpty()
Boolean.Trueの場合には空/未定義/blank/nullになります。
jQuery.Guid.IsValid()
Boolean.Trueに有効なことでない場合はfalse
jQuery.Guid.Set()
Retrnsす.を設定する指定したユーザガイドが無効を返す空のガイド.
簡単なコードを使用する crypto.getRandomValues(a)
月 対応ブラウザ (IE11+,iOS7+,FF21+、Chrome、Android版google Chrome).を回避を Math.random()
が引き起こすことが可能な衝突(例えば20衝突4000発生するuuid実の状況により Muxa).
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);
}
注記:
- 最適化されたコードを読みやすい速度でも数百uuidでも発生することがあります。成約10000uuid()で毎秒クロムマンソ http://jsbin.com/fuwigo/1 測定。
- 使用8"y"で簡単にコードを読みやすさ(y更させていただくことがあります8,9では、Bのいずれかの記号が入ります。