JavaScriptÔÇÖte GUID / UUID olu┼čtur?


Al─▒nan cevaba git


JavaScript'te global olarak benzersiz tan─▒mlay─▒c─▒lar olu┼čturmaya ├žal─▒┼č─▒yorum. T├╝m taray─▒c─▒larda hangi rutinlerin mevcut oldu─čundan, dahili rasgele say─▒ ├╝retecinin "rasgele" olarak nas─▒l s─▒raland─▒─č─▒ndan emin de─čilim.

GUID / UUID en az 32 karakterden olu┼čmal─▒ ve etrafta dola┼č─▒rken sorun ya┼čanmamas─▒ i├žin ASCII aral─▒─č─▒nda kalmal─▒d─▒r.


3855









Cevap say─▒s─▒n─▒ say: 30






RFC 4122'ye g├Âre GUID (Globally Unique IDentifier) ÔÇőÔÇőolarak da bilinen UUID'ler (Evrensel Benzersiz Tan─▒mlay─▒c─▒), belirli bir benzersizlik garantisine sahip tan─▒mlay─▒c─▒lard─▒r.

Bunlar─▒ olu┼čturman─▒n en iyi yolu, s├Âz konusu RFC'deki uygulama talimatlar─▒n─▒ takip etmek, topluluk taraf─▒ndan onaylanm─▒┼č a├ž─▒k kaynak uygulamalar─▒ndan birini kullanmakt─▒r.

JavaScript'te UUID'lerle ├žal─▒┼čmak i├žin pop├╝ler bir A├ž─▒k Kaynak arac─▒ d├╝─č├╝m-uuid'dir

Tan─▒mlay─▒c─▒lar─▒ bayt by by veya karakter karakter olarak rastgele olu┼čturman─▒n size uygun bir uygulama ile ayn─▒ garantileri vermeyece─čini unutmay─▒n. Ayr─▒ca, ├žok ├Ânemli, uyumlu UUID'lerle ├žal─▒┼čan sistemler rastgele olu┼čturulmu┼č olanlar─▒ kabul etmemeyi se├žebilir ve bir├žok a├ž─▒k kaynak do─črulay─▒c─▒s─▒ asl─▒nda ge├žerli bir yap─▒ olup olmad─▒─č─▒n─▒ kontrol eder.

Bir UUID bu formata sahip olmal─▒d─▒r:

 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
 

Burada M ve N pozisyonlar─▒ sadece belirli de─čerlere sahip olabilir. ┼×u anda, M i├žin ge├žerli olan tek de─čerler 1, 2, 3, 4 ve 5'tir, bu nedenle bu pozisyonu rastgele olu┼čturmak ├žo─ču sonucu kabul edilemez hale getirir.


2205







Bir ─░├žin RFC4122 s├╝r├╝m 4 uyumlu ├ž├Âz├╝m, bu tek sat─▒rl─▒k (imsi) ├ž├Âz├╝m├╝ ben ile gelebilir en kompakt .:

 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()); 

G├╝ncelleme, 2015-06-02 : UUID benzersizli─činin, altta yatan rasgele say─▒ ├╝retecine (RNG) ba─čl─▒ oldu─čunu unutmay─▒n. Kullan─▒mlar, yukar─▒da ├ž├Âzelti Math.random() k─▒sa olmas─▒ i├žin, ancak Math.random() bir de─čil , y├╝ksek kaliteli rng garantilidir. Ayr─▒nt─▒lar i├žin Math.random () sayfas─▒ndaki Adam Hyland'in m├╝kemmel yaz─▒s─▒na bak─▒n─▒z. Daha sa─člam bir ├ž├Âz├╝m i├žin, m├╝mk├╝n oldu─čunda daha y├╝ksek kalitede RNG API'leri kullanan uuid mod├╝l├╝ (feragatname: Ben yazar─▒m) gibi bir ┼čey d├╝┼č├╝n├╝n .

G├╝ncelleme, 2015/08/26 : Bir yan not olarak, bu ├Âz├╝ ├žarp─▒┼čma belli bir olas─▒l─▒k ula┼čmadan ├Ânce olu┼čturulabilir ka├ž kimlikleri nas─▒l belirlenece─či anlat─▒lmaktad─▒r. ├ľrne─čin, 3.26x10 15 s├╝r├╝m 4 RFC4122 UUID'ler ile milyonda bir ├žarp─▒┼čma ┼čans─▒n─▒z var.

G├╝ncelleme, 2017-06-28 : Chrome geli┼čtiricilerinden Chrome, Firefox ve SafariÔÇÖde Math.random PRNG kalitesini tart─▒┼čan iyi bir makale . tl; dr - 2015 sonu itibariyle "olduk├ža iyi", ancak kriptografik de─čil. Bu sorunu gidermek i├žin ES6, crypto API ve biraz da JS sihirbaz─▒ kullanan yukar─▒daki ├ž├Âz├╝m├╝n g├╝ncellenmi┼č bir s├╝r├╝m├╝ :

 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()); 


3732







Broofa'n─▒n cevab─▒n─▒n ne kadar temiz oldu─čunu ger├žekten seviyorum , ama bu k├Ât├╝ uygulamalar─▒n Math.random ├žarp─▒┼čma ┼čans─▒ b─▒rakmas─▒ talihsiz bir durum .

─░┼čte bu , ilk 13 hex numaralar─▒n─▒ zaman damgas─▒n─▒n hex k─▒sm─▒yla ve pageload'dan bu yana mikrosantan─▒n onalt─▒l─▒k k─▒sm─▒yla ofseti┼čtirerek ofset ederek bu sorunu ├ž├Âzen benzer bir RFC4122 s├╝r├╝m 4 uyumlu bir ├ž├Âz├╝m. Bu ┼čekilde, Math.random ayn─▒ tohumda olsa bile , her iki m├╝┼čterinin de UUID'e, ayn─▒ y├╝klenen (ayn─▒ zamanda, y├╝ksek performans s├╝resi desteklenirse) ve ayn─▒ milisaniyede (ya da 10.000 y─▒l sonra) ayn─▒ say─▒daki mikrosaniyeyi ├╝retmesi gerekecektir. ayn─▒ UUID'yi al:

 function generateUUID() { // Public Domain/MIT
    var d = new Date().getTime();//Timestamp
    var d2 = (performance && 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);
    });
}

console.log(generateUUID()) 


─░┼čte test edilecek bir keman.


774







broofa'n─▒n cevab─▒ olduk├ža kaygan, ger├žekten - etkileyici ┼čekilde zekice, ger├žekten ... rfc4122 uyumlu, biraz okunakl─▒ ve kompakt. M├╝thi┼č!

Ancak, bu d├╝zenli ifadeye, bu replace() geri aramalar─▒n toString() ve Math.random() i┼člev ├ža─čr─▒lar─▒n─▒n (sonucun sadece 4 bitini kulland─▒─č─▒ ve gerisini bo┼ča harcad─▒─č─▒) bak─▒yorsan─▒z, performans─▒ merak etmeye ba┼člayabilirsiniz. Asl─▒nda joelpt, genel GUID h─▒z─▒ i├žin RFC'yi atmaya bile karar verdi generateQuickGUID .

Ancak, h─▒z ve RFC uyumlulu─čunu alabilir miyiz ? Evet dedim! Okunabilirli─či koruyabilir miyiz? ┼×ey ... Pek say─▒lmaz, ama takip etmek kolayd─▒r.

Ama ├Ânce, benim sonu├žlar─▒m, brofafa guid (kabul edilen cevap) ve rfc uyumlu olmayanlarla kar┼č─▒la┼čt─▒r─▒ld─▒─č─▒nda 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.
 

Bu y├╝zden, 6nc─▒ optimizasyon yinelememle, en pop├╝ler cevab─▒ 12X'in ├╝zerinde, 9X'in ├╝zerinde kabul edilen cevab─▒ ve 2-3X'in h─▒zl─▒ uyumlu cevab─▒n─▒ yendim . Ve hala rfc4122 ile uyumluyum.

Nas─▒l ilgileniyorsunuz? Kayna─č─▒n tamam─▒n─▒ http://jsfiddle.net/jcward/7hyaC/3/ ve http://jsperf.com/uuid-generator-opt/4 adreslerine koydum.http://jsperf.com/uuid-generator-opt/4

Bir a├ž─▒klama i├žin broofa kodu ile ba┼člayal─▒m:

 '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);
});
 

Bu nedenle, x rastgele onalt─▒l─▒k basamakla de─či┼čtirir, y rastgele verilerle (ilk 2 bit'i 10 RFC spesifikasyonuna g├Âre zorlamak hari├ž ) ve regex, karakterlerle - veya 4 karakterlerle e┼čle┼čmez , bu nedenle onlarla u─čra┼čmas─▒ gerekmez. ├çok, ├žok kaygan.

Bilinmesi gereken ilk ┼čey, i┼člev ifadelerinin normal ifadelerde oldu─ču gibi pahal─▒ olmas─▒d─▒r (yaln─▒zca 1 kullanmas─▒na ra─čmen, her e┼čle┼čmede bir tane olmak ├╝zere 32 geri ├ža─č─▒rmaya ve 32 geri ├ža─č─▒rman─▒n her birinde Math.random () ve v olarak adland─▒r─▒l─▒r. toString (16)).

Performansa do─čru ilk ad─▒m RegEx ve geri ├ža─č─▒rma i┼člevlerini ortadan kald─▒rmak ve bunun yerine basit bir d├Âng├╝ kullanmakt─▒r. Elimizdeki bu ara├žlar ile u─čra┼čmak - ve 4 broofa dayanmam─▒┼čken karakterler. Ayr─▒ca, kaygan String ┼čablonu mimarisini korumak i├žin String Array dizinini kullanabilece─čimize dikkat edin:

 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;
}
 

Temel olarak, ayn─▒ i├ž mant─▒─č─▒, kontrol etmemiz d─▒┼č─▒nda - ya da 4 bir s├╝re d├Âng├╝s├╝ kullanmak ( replace() geri aramalar yerine ) bize neredeyse 3 kat daha iyi bir geli┼čme sa─čl─▒yor!

Bir sonraki ad─▒m, masa├╝st├╝nde k├╝├ž├╝k bir ad─▒m olmakla birlikte, mobil cihazlarda iyi bir fark yarat─▒r. ┼×imdi daha az Math.random () ├ža─čr─▒s─▒ yap─▒p, her yinelemeyi de─či┼čtiren rastgele bir tamponla% 87'sini atmak yerine t├╝m bu rastgele bitleri kullanal─▒m. Ayr─▒ca, bu ┼čablon tan─▒m─▒n─▒, sadece yard─▒mc─▒ olmas─▒ durumunda, d├Âng├╝den ├ž─▒karal─▒m:

 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
}
 

Bu da platforma ba─čl─▒ olarak% 10-30 tasarruf sa─čl─▒yor. Fena de─čil. Ancak bir sonraki b├╝y├╝k ad─▒m, toString i┼člevinin bir optimizasyon klasi─či ile ├ža─čr─▒lardan tamamen kurtar─▒lmas─▒d─▒r - arama tablosu. 16 elemanl─▒ basit bir arama tablosu toString'in (16) i┼čini ├žok daha k─▒sa s├╝rede ger├žekle┼čtirir:

 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
}
 

Bir sonraki optimizasyon ba┼čka bir klasik. Her d├Âng├╝ yinelemesinde yaln─▒zca 4 bit ├ž─▒kt─▒ kulland─▒─č─▒m─▒zdan, d├Âng├╝ say─▒s─▒n─▒ yar─▒ya indirelim ve her yinelemede 8 bit i┼čleyelim. Bu ├žok zor, ├ž├╝nk├╝ RFC uyumlu bit konumlar─▒n─▒ kullanmak zorunday─▒z, ancak ├žok da zor de─čil. Daha sonra 0x00 - 0xff saklamak i├žin daha geni┼č bir arama tablosu yapmam─▒z gerekiyor (16x16 veya 256) ve e5 () i┼člevinin d─▒┼č─▒nda sadece bir kez olu┼čturduk.

 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
}
 

Hala 256 elemanl─▒ LUT kullanarak, bir seferde 16 bit i┼čleyen bir e6 () denedim ve optimizasyonun azalan getirilerini g├Âsterdi. Daha az yineleme olmas─▒na ra─čmen, i├ž mant─▒k artan i┼člemden dolay─▒ karma┼č─▒kt─▒ ve ayn─▒ ┼čeyi masa├╝st├╝nde ger├žekle┼čtirdi ve mobilde sadece ~% 10 daha h─▒zl─▒.

Uygulanacak son optimizasyon tekni─či - d├Âng├╝y├╝ kald─▒r─▒n. Sabit bir say─▒da d├Âng├╝ olu┼čturdu─čumuzdan, bunu teknik olarak elle yazabiliriz. Bunu bir kez daha atamaya devam etti─čim tek bir rastgele de─či┼čken r ile denedim ve performans tankland─▒. Ancak d├Ârt de─či┼čkene ├Ânceden rasgele veri atanm─▒┼č, ard─▒ndan arama tablosunu kullanarak ve uygun RFC bitlerini uygulayarak, bu s├╝r├╝m hepsini i├žiyor:

 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];
}
 

Mod├╝le: http://jcward.com/UUID.js - UUID.generate()

─░┼čin garibi, 16 byte'l─▒k rasgele veri olu┼čturmak kolay k─▒sm─▒. T├╝m hile RFC uyumu ile String format─▒nda ifade ediyor ve en s─▒k 16 byte rastgele veri, kontrols├╝z bir d├Âng├╝ ve arama tablosu ile ba┼čar─▒l─▒r.

Umar─▒m mant─▒─č─▒m do─črudur - bu t├╝r s─▒k─▒c─▒ i┼člerde hata yapmak ├žok kolayd─▒r. Fakat ├ž─▒kt─▒lar bana iyi geldi. Umar─▒m kod optimizasyonu ile bu deli s├╝r├╝┼č zevk!

Tavsiye olun: temel amac─▒m potansiyel optimizasyon stratejilerini g├Âstermek ve ├Â─čretmekti. Di─čer cevaplar, iyi UUID'ler olu┼čturmak i├žin ├Ânemli olan ├žarp─▒┼čmalar ve ger├žekten rastgele say─▒lar gibi ├Ânemli konular─▒ kapsar.


381







─░┼čte RFC 4122 , b├Âl├╝m 4.4 (Ger├žekten Rastgele Rastgele veya S├Âzde Rastgele Say─▒dan bir UUID Olu┼čturma Algoritmalar─▒) temelinde baz─▒ kodlar .

 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;
}
 

151







 let uniqueId = Math.random().toString(36).substring(2) + Date.now().toString(36);
 

 document.getElementById("unique").innerHTML =
  Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36); 
 <div id="unique">
</div> 

Kimlikler 1 milisaniyeden daha fazla aral─▒klarla ├╝retiliyorsa,% 100 benzersizdir.

─░ki ID daha k─▒sa aral─▒klarla ├╝retilirse ve rastgele y├Ântemin ger├žekten rastgele oldu─čunu varsayarsak, bu% 99.99999999999999 'un global olarak benzersiz olmas─▒ muhtemel olan ID'ler ├╝retecektir (10 / 15'in 1'inde ├žarp─▒┼čma).

Daha fazla basamak ekleyerek bu say─▒y─▒ art─▒rabilirsiniz, ancak% 100 benzersiz kimlik olu┼čturmak i├žin genel bir saya├ž kullanman─▒z gerekir.

RFC uyumlulu─čuna ihtiyac─▒n─▒z varsa, bu bi├žimlendirme ge├žerli bir s├╝r├╝m 4 GUID olarak ge├žer:

 let u = Date.now().toString(16) + Math.random().toString(16) + '0'.repeat(16);
let guid = [u.substr(0,8), u.substr(8,4), '4000-8' + u.substr(13,3), u.substr(16,12)].join('-');
 

 let u = Date.now().toString(16)+Math.random().toString(16)+'0'.repeat(16);
let guid = [u.substr(0,8), u.substr(8,4), '4000-8' + u.substr(13,3), u.substr(16,12)].join('-');
document.getElementById("unique").innerHTML = guid; 
 <div id="unique">
</div> 

D├╝zenleme: Yukar─▒daki kod, niyetini takip eder, ancak RFC'nin mektubunu takip etmez. Di─čer tutars─▒zl─▒klar aras─▒nda k─▒sa birka├ž rasgele rakam var. (─░htiyac─▒n─▒z olursa daha fazla rasgele rakam ekleyin) Ba┼č,% 100 uyumlu kodla kar┼č─▒la┼čt─▒r─▒ld─▒─č─▒nda bunun ger├žekten h─▒zl─▒ olmas─▒. GUID'inizin ge├žerlili─čini burada test edebilirsiniz .


127







Format─▒nda en h─▒zl─▒ GUID benzeri string generator y├Ântemi XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX . Bu standart uyumlu bir GUID olu┼čturmaz.

Bu uygulaman─▒n 10 milyon ├žal─▒┼čt─▒rmas─▒ sadece bir taray─▒c─▒da g├Ârd├╝─č├╝m en h─▒zl─▒ olan 32.5 saniye s├╝r├╝yor (d├Âng├╝ler / yinelemeler olmadan tek ├ž├Âz├╝m).

─░┼člev ┼ču kadar basittir:

 /**
 * Generates a GUID string.
 * @returns {String} The generated GUID.
 * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
 * @author Slavik Meltser ([email protected]).
 * @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();
}
 

Performans─▒ test etmek i├žin bu kodu ├žal─▒┼čt─▒rabilirsiniz:

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

Eminim ├žo─čunuz orada ne yapt─▒─č─▒m─▒ anlayacaks─▒n─▒zd─▒r, ama belki bir a├ž─▒klama yapmas─▒ gereken en az bir ki┼či vard─▒r:

Algoritmas─▒:

  • Math.random() Fonksiyonu (├Ârne─čin, bir ondal─▒k kesir noktadan sonra 16 hane ile 0 ile 1 aras─▒nda bir say─▒y─▒ d├Ând├╝ren 0.4363923368509859 ).
  • Sonra bu say─▒y─▒ al─▒r─▒z ve taban─▒n─▒ 16 olan bir dizgeye ├ževiririz (yukar─▒daki ├Ârnekten alaca─č─▒z 0.6fb7687f ).
    Math.random().toString(16) .
  • Sonra 0. ├Ânekleri kesiyoruz ( 0.6fb7687f => 6fb7687f ) ve sekiz onalt─▒l─▒k karakter uzunlu─čunda bir dize al─▒yoruz .
    (Math.random().toString(16).substr(2,8) .
  • Bazen Math.random() i┼člev 0.4363 , sonunda s─▒f─▒r oldu─čundan (├Ârne─čin yukar─▒daki say─▒dan dolay─▒) k─▒sa say─▒y─▒ d├Ând├╝r├╝r (├Ârne─čin 0.4363000000000000 ). Bu y├╝zden bu dizgeye "000000000" (dokuz s─▒f─▒rdan olu┼čan bir dize) ekliyorum ve sonra onu substr() tam olarak dokuz karakter yapmak i├žin i┼člevle kesiyorum (s─▒f─▒rlar─▒ sa─ča dolduruyorum).
  • Tam olarak dokuz s─▒f─▒r eklemenin nedeni, Math.random() i┼člevin tam olarak 0 veya 1 (her biri i├žin 1/10 ^ 16 olas─▒l─▒k) verece─či en k├Ât├╝ durum senaryosudur . Bu y├╝zden ona dokuz tane s─▒f─▒r ( "0"+"000000000" veya "1"+"000000000" ) eklememiz ve daha sonra sekiz karakter uzunlu─čunda olan ikinci dizinden (3. karakter) kesmemiz gerekiyordu. Vakalar─▒n geri kalan─▒ i├žin, s─▒f─▒rlar─▒n eklenmesi sonuca zarar vermeyecektir, ├ž├╝nk├╝ yine de kesmektedir.
    Math.random().toString(16)+"000000000").substr(2,8) .

Derleme:

  • GUID a┼ča─č─▒daki bi├žimdedir XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX .
  • GUID'i 4 par├žaya b├Âld├╝m, her par├ža 2 tipe (ya da bi├žime) b├Âl├╝nd├╝: XXXXXXXX ve -XXXX-XXXX .
  • ┼×imdi a┼ča─č─▒daki gibi, ├ža─čr─▒ 4 adet GUID araya getirmek i├žin bu 2 t├╝rlerini kullanarak GUID in┼ča ediyorum: XXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX .
  • Bu iki tip aras─▒nda farkl─▒l─▒k g├Âstermek i├žin, bir ├žift yarat─▒c─▒s─▒ i┼člevine flag parametresi ekledim _p8(s) , s parametre i┼čleve ├žizgi ekleyip eklemeyece─čini bildirir.
  • Sonunda GUID'i a┼ča─č─▒daki zincirleme ile derleriz:, _p8() + _p8(true) + _p8(true) + _p8() ve onu geri d├Ând├╝r├╝n .

Blogumdaki bu yay─▒na ba─člant─▒

Keyfini ├ž─▒kar─▒n! :-)


87







─░┼čte en ├žok oylanan cevab─▒n bir kombinasyonu, Chrome'un ├žarp─▒┼čmalar─▒ i├žin bir ge├žici ├ž├Âz├╝m :

 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);
        });
    };
 

http://jsbin.com/uqives/3Test etmek istersen JSB'de .


62







─░┼čte ASCII g├╝venli bir GUID benzeri benzersiz bir tan─▒mlay─▒c─▒ olu┼čturmak i├žin tamamen uyumlu olmayan ama ├žok performansl─▒ bir uygulama.

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

26 [a-z0-9] karakter olu┼čturur, RFC uyumlu GUID'lerden hem daha k─▒sa hem de daha benzersiz olan bir UID verir. ─░nsan okunabilirli─či ├Ânemliyse k─▒sa ├žizgiler ├Ânemsiz ┼čekilde eklenebilir.

─░┼čte bu fonksiyon i├žin kullan─▒m ├Ârnekleri ve zamanlamalar─▒ ve bu sorunun birka├ž cevab─▒. Zamanlama, her biri 10 milyon yineleme olan Chrome m25 alt─▒nda ger├žekle┼čtirildi.

 >>> 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
 

─░┼čte zamanlama kodu.

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

60







─░┼čte 9 Ekim 2011 tarihli , https://gist.github.com/982883 adresindeki jed kullan─▒c─▒s─▒n─▒n yorumundan bir ├ž├Âz├╝m :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)}
 

Bu, mevcut en y├╝ksek puanl─▒ cevapla ayn─▒ hedefi ger├žekle┼čtirir , ancak 50'den az baytta zorlama, ├Âzyineleme ve ├╝stel g├Âsterimden yararlanarak. Nas─▒l ├žal─▒┼čt─▒─č─▒n─▒ merak edenler i├žin, i┼čte fonksiyonun eski bir versiyonunun a├ž─▒klamal─▒ formu:

 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
      )
}
 

56







G├Ânderen Sagi'ye shkedy teknik blogu :

 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;
}
 

Bir ActiveX denetimi kullanmay─▒ gerektiren ancak bunlardan uzak durman─▒n ba┼čka y├Ântemleri de var!

D├╝zenleme: Hi├žbir GUID olu┼čturucunun benzersiz anahtarlar─▒ garanti edemeyece─čine i┼čaret etmeye de─čece─čini d├╝┼č├╝nd├╝m ( wikipedia makalesini inceleyin ). Her zaman bir ├žarp─▒┼čma ┼čans─▒ vard─▒r. Bir GUID, ├žarp─▒┼čma de─či┼čimini neredeyse s─▒f─▒r seviyesine indirgeyecek kadar geni┼č bir anahtar evreni sunar.


41







Node-uuid kullanabilirsiniz ( https://github.com/kelektiv/node-uuid )

Basit, h─▒zl─▒ nesil RFC4122 UUIDS.

├ľzellikler:

  • RFC4122 s├╝r├╝m 1 veya s├╝r├╝m 4 UUID'leri olu┼čturun
  • Node.js ve taray─▒c─▒larda ├žal─▒┼č─▒r.
  • Destekleyici platformlarda kriptografik olarak g├╝├žl├╝ rasgele # nesil.
  • Az yer kaplama (Daha k├╝├ž├╝k bir ┼čey ister misiniz? ┼×una bir bak─▒n ! )

NPM Kullanarak Kur:

 npm install uuid
 

Veya uuid'i taray─▒c─▒ arac─▒l─▒─č─▒yla kullanma:

Raw Dosyas─▒n─▒ ─░ndir (uuid v1): https://raw.githubusercontent.com/kelektiv/node-uuid/master/v1.js Raw Dosyas─▒n─▒ ─░ndir (uuid v4): https://raw.githubusercontent.com/kelektiv/node -uuid / ana / v4.js


Daha k├╝├ž├╝k ister misin? ┼×una bir g├Âz at─▒n: https://gist.github.com/jed/982883


Kullan─▒m─▒:

 // 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();
 

38







Bir web servisi faydal─▒ olacakt─▒r.

H─▒zl─▒ Google bulundu: http://www.hoskinson.net/GuidGenerator/

Bu uygulama i├žin kefil olamaz, ancak SOMEONE bir bonafide GUID olu┼čturucu yay─▒nlamal─▒d─▒r.

B├Âyle bir web servisiyle, GUID web servisini kullanan ve AJAX ├╝zerinden bir taray─▒c─▒da javascript ile hizmet veren bir REST web aray├╝z├╝ geli┼čtirebilirsiniz.


31







 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);
    });
};
 

D├ťZENLE:

Bu i┼člevi kullanan projemi tekrar ziyaret ettim ve ayr─▒nt─▒lar─▒n─▒ be─čenmedim. - Ama uygun rastlant─▒sall─▒k gerekiyordu.

Briguy37'nin cevab─▒n─▒ ve baz─▒ bitli operat├Ârleri ara┼čt─▒ran boyutta pencereleri tampondan ├ž─▒karmak i├žin kullan─▒lan bir versiyon.

Java'n─▒n UUID'siyle uyumlu olmayan uuid'leri en son ayr─▒┼čt─▒rma Problemlerim oldu─ču i├žin RFC Tip 4 (rastgele) ┼čemaya uymal─▒.


31







Bu konudaki en iyi cevaplar─▒n bir kombinasyonu olarak basit JavaScript mod├╝l├╝.

 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()); 

Kullan─▒m─▒:

Guid.newGuid ()

"C6c2d12f-d76b-5739-e551-07e6de5b0807"

Guid.empty

"00000000-0000-0000-0000-000000000000"


29







Bunun zaten bir s├╝r├╝ cevab─▒ var ama maalesef grupta rastgele bir "do─čru" yok. A┼ča─č─▒daki s├╝r├╝m, broofa'n─▒n cevab─▒n─▒n bir uyarlamas─▒d─▒r, ancak mevcut oldu─čunda kripto k├╝t├╝phanelerini kullanan "ger├žek" rastgele bir i┼člevi ve bir geri d├Ân├╝┼č olarak Alea () i┼člevini i├žerecek ┼čekilde g├╝ncellenmi┼čtir.

   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 https://web.archive.org/web/20120502223108/http://baagoe.com/en/RandomMusings/javascript/
      // Johannes Baag├â┬Şe <[email protected]>, 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 <[email protected]>, 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);
  });
};
 

25







GitHub'daki JavaScript projesi - https://github.com/LiosK/UUID.js

UUID.js JavaScript i├žin RFC uyumlu UUID ├╝reteci.

RFC 4122 http://www.ietf.org/rfc/rfc4122.txt adresini ziyaret edin .

├ľzellikler RFC 4122 uyumlu UUID'ler ├╝retir.

S├╝r├╝m 4 UUID'ler (rastgele say─▒lardan UUID'ler) ve s├╝r├╝m 1 UUID'leri (zamana dayal─▒ UUID'ler) mevcuttur.

UUID nesnesi, UUID alanlar─▒na eri┼čim dahil olmak ├╝zere UUID'ye ├že┼čitli eri┼čime izin verir.

JavaScript'in d├╝┼č├╝k zaman damgas─▒ ├ž├Âz├╝n├╝rl├╝─č├╝ rasgele say─▒larla telafi edilir.


24







Bu, s├╝r├╝m 4 UUID (s├Âzde rasgele say─▒lardan olu┼čturulmu┼č) olu┼čturur:

 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('');
}
 

─░┼čte ├╝retilen UUID'lerin bir ├Ârne─či:

 682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136
 

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('-');
 

17







Kendi UUID / GUID jenerat├Âr├╝m├╝ burada baz─▒ ekstralarla ayarlad─▒ .

Ben kullan─▒yorum ┼ču Kybos biraz daha kriptografik ses olmaya rasgele say─▒ ├╝reteci.

A┼ča─č─▒da benim baagoe.com gelen Mash ve Kybos y├Ântemleri ile benim senaryo hari├ž.

 //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 <[email protected]>, 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)); 

14







Broofa'n─▒n cevab─▒n─▒ anlamak istedim, bu y├╝zden geni┼čletip yorum ekledim:

 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);
        }
    );
};
 

14







Bu sadece basit bir AJAX ├ža─čr─▒s─▒ ...

Hala ilgilenen varsa, i┼čte benim ├ž├Âz├╝m├╝m.

Sunucu taraf─▒nda:

 [WebMethod()]
public static string GenerateGuid()
{
    return Guid.NewGuid().ToString();
}
 

M├╝┼čteri taraf─▒nda:

 var myNewGuid = null;
PageMethods.GenerateGuid(
    function(result, userContext, methodName)
    {
        myNewGuid = result;
    },
    function()
    {
        alert("WebService call failed.");
    }
);
 

11







Daha iyi yol:

 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
 }
 

Minimize edilmi┼č:

 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}
 

11







ES6 ├Ârne─či

 const guid=()=> {
  const s4=()=> Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);     
  return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`;
}
 

11







Bu, tarihe dayan─▒r ve benzersizli─či sa─člamak i├žin rastgele bir sonek ekler. Css tan─▒mlay─▒c─▒lar─▒ i├žin iyi ├žal─▒┼č─▒yor. Her zaman gibi bir ┼čey d├Ând├╝r├╝r ve kesmek kolayd─▒r:

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;
        };
 

10







H─▒z─▒ dikkate alan rfc4122 s├╝r├╝m 4 uyumlu bir ├ž├Âz├╝m isteyenler i├žin (├žok az Math.random () ├ža─čr─▒s─▒):

 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() ); 

Yukar─▒daki fonksiyon, h─▒z ve rastgelelik aras─▒nda iyi bir dengeye sahip olmal─▒d─▒r.


10







Biliyorum, bu eski bir soru. Sadece b├╝t├╝nl├╝k i├žin, ortam─▒n─▒z SharePoint ise, yeni bir k─▒lavuz olu┼čturan SP.Guid.newGuid ( msdn link ) ad─▒nda bir yard─▒mc─▒ program i┼člevi vard─▒r . Bu i┼člev sp.init.js dosyas─▒n─▒n i├žindedir. Bu i┼člevi yeniden yazarsan─▒z (di─čer baz─▒ ba─č─▒ml─▒l─▒klar─▒ di─čer ├Âzel i┼člevlerden kald─▒rmak i├žin), ┼čuna benzer:

 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;
};
 

9







GuidÔÇÖi g├╝zel bir ┼čekilde i┼čleyen bir jQuery eklentisi var @ http://plugins.jquery.com/project/GUID_Helper

 jQuery.Guid.Value()
 

Dahili K─▒lavuzun de─čerini d├Ând├╝r├╝r. K─▒lavuz belirtilmemi┼čse, yeni bir tane d├Ând├╝r├╝r (de─čer daha sonra dahili olarak depolan─▒r).


 jQuery.Guid.New()
 

Yeni bir K─▒lavuz d├Ând├╝r├╝r ve de─čerini dahili olarak ayarlar.


 jQuery.Guid.Empty()
 

Bo┼č bir K─▒lavuz d├Ând├╝r├╝r 00000000-0000-0000-0000-000000000000.


 jQuery.Guid.IsEmpty()
 

Boole d├Ând├╝r├╝r. Bo┼č / tan─▒ms─▒z / bo┼č / bo┼č ise ge├žerlidir.


 jQuery.Guid.IsValid()
 

Boole d├Ând├╝r├╝r. Ger├žek ge├žerli k─▒lavuz, de─čilse yanl─▒┼č.


 jQuery.Guid.Set()
 

Guid'i tekrar getirir. Guid'i kullan─▒c─▒ taraf─▒ndan belirlenen Guid'e ayarlar, ge├žersizse bo┼č bir guid d├Ând├╝r├╝r.


9







Basit kod that use crypto.getRandomValues(a) ├╝zerinde desteklenen taray─▒c─▒lar (IE11 + iOS7 +, FF21 +, Chrome, Android Chrome). Kullanmaktan ka├ž─▒n─▒r Math.random() ki (bir ger├žek durum ├Ârne─čin 4000 ├╝retilen UUID i├žin 20 ├žarp─▒┼čmalar ├žarp─▒┼čmalar neden olabilir, ├ž├╝nk├╝ 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);
}
 

Notlar:

  • Kod okunabilirli─či i├žin optimize edilmi┼č h─▒z de─čil, bu y├╝zden saniyede birka├ž y├╝z uuid demek i├žin uygun. Performans─▒m─▒ ├Âl├žmek i├žin http://jsbin.com/fuwigo/1 adresini kullanarak diz├╝st├╝ bilgisayar─▒mda Chromium'da saniyede yakla┼č─▒k 10000 uuid () olu┼čturuyor .
  • Yaln─▒zca "y" i├žin 8 kullan─▒r, ├ž├╝nk├╝ kod okunabilirli─čini basitle┼čtirir (y, 8, 9, A veya B olabilir).

9







Belirli bir bi├žimde rastgele bir 128 bit dizgiye ihtiyac─▒n─▒z varsa, kullanabilirsiniz:

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

Hangi gibi bir ┼čey d├Ânecek 2350143528-4164020887-938913176-2513998651 .


9



─░lgili yay─▒nlar


JavaScript'te ├žok sat─▒rl─▒ dizeler olu┼čturma

Python'da bir GUID / UUID nas─▒l olu┼čturulur

Insert deyimi i├žin Postgres'te bir UUID olu┼čturuluyor mu?

Dinamik olarak JavaScript'te CSS s─▒n─▒f─▒ nas─▒l olu┼čturulur ve uygulan─▒r?

Java'da bir UUID'nin en ├Ânemli bitlerini kullanarak ├žarp─▒┼čma olas─▒l─▒─č─▒

GUID / UUID veritaban─▒ anahtarlar─▒n─▒n avantajlar─▒ ve dezavantajlar─▒

─░OS kullanarak bir GUID / UUID nas─▒l olu┼čturulur

Metin i├žinde regex ile UUID'ler aran─▒yor

JavaScript'te bir nesne olu┼čturmak i├žin en iyi yol hangisidir? Bir nesne ├Âzelli─činden ├Ânce var 'gerekli midir?

Javascript'te sorgu parametreleri nas─▒l olu┼čturulur?

Etiketle ilgili di─čer sorular [javascript]


De─či┼čkenlerin olup olmad─▒─č─▒n─▒ g├Ârmek i├žin JavaScript kontrol├╝

++ [[]] [+ []] + [+ []] neden ÔÇť10ÔÇŁ dizesini d├Ând├╝r├╝yor?

Sanal y─▒k─▒c─▒lar ne zaman kullan─▒l─▒r?

Dize ad─▒ verilen bir mod├╝l nas─▒l al─▒n─▒r?

Bir NumPy dizisinde N maksimum de─čer endekslerini nas─▒l alabilirim?

Gradle'─▒n IDEA'daki evi nas─▒l tan─▒mlan─▒r?

Herhangi bir dalda bir dize tan─▒tan Git i┼čini nas─▒l bulabilirim?

Nesne yay─▒lmas─▒ ve Object.assign

Tf.placeholder ve tf.Variable aras─▒ndaki fark nedir?

Collections.emptyList (), <Object> Listesini d├Ând├╝r├╝r m├╝?