GUID / UUID නිර්මාණය කරන්නේ කෙසේද?


4189

මම උත්සාහ කරන්නේ ජාවාස්ක්‍රිප්ට් හි ගෝලීයව අනන්‍ය වූ හඳුනාගැනීම් නිර්මාණය කිරීමට ය. සියලුම බ්‍රව්සර්වල ඇති චර්යාවන් මොනවාද, “අහඹු” සහ බිල්ට් සසම්භාවී සංඛ්‍යා උත්පාදක යන්ත‍්‍රය කෙසේ දැයි මට විශ්වාස නැත.

GUID / UUID අවම වශයෙන් අක්ෂර 32 ක් විය යුතු අතර ඒවා වටා ගමන් කිරීමේදී කරදර වළක්වා ගැනීම සඳහා ASCII පරාසය තුළ රැඳී සිටිය යුතුය.


13
GUIDs නූල් ලෙස පුනරාවර්තනය වන විට අවම වශයෙන් අක්ෂර 36 ක් හා අක්ෂර 38 කට නොඅඩු දිගින් යුක්ත වන අතර pattern \ {? [A-zA-Z0-9] {36}? \} The රටාවට ගැලපේ. එබැවින් සෑම විටම ascii වේ.
ඇන්තනි ඩබ්ලිව් ජෝන්ස්

2
ඩේවිඩ් Bau වඩා හොඳ වඩා සපයයි, දී seedable අහඹු අංක ජනනය davidbau.com/archives/2010/01/30/... මම UUIDs ජනනය කිරීමට තරමක් වෙනස් ප්රවේශයක් දක්වා ලියූ blogs.cozi.com/tech/2010/04/generating- uuids-in-javascript.html
ජෝර්ජ් වී. රීලි

කිසිවෙකු තවමත් මේ ගැන සඳහන් කර නැති නමුත් සම්පූර්ණත්වය සඳහා, එන්පීඑම් හි මාර්ගෝපදේශ ජනක යන්ත්‍ර රාශියක් ඇත . ඒවායින් බොහොමයක් බ්‍රව්සරයේ ද වැඩ කිරීමට ඔට්ටු තැබීමට මම කැමැත්තෙමි.
ජෝර්ජ් මවර්

Answers:


2342

RFC 4122 ට අනුව GUIDs (ගෝලීය වශයෙන් අද්විතීය හැඳුනුම්පත) ලෙසද හැඳින්වෙන UUIDs (විශ්වීය අද්විතීය හැඳුනුම්පත), ඇතැම් සුවිශේෂීතා සහතික ලබා දීම සඳහා නිර්මාණය කර ඇති හඳුනාගැනීම් වේ.

JS හි පේළි කිහිපයකින් RFC- අනුකූල UUIDs ක්‍රියාත්මක කළ හැකි අතර (උදා: @ බ්‍රූෆාගේ පිළිතුර බලන්න, පහත) පොදු අන්තරායන් කිහිපයක් තිබේ:

  • අවලංගු හැඳුනුම් ආකෘතිය (UUIDs " xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" ස්වරූපයෙන් විය යුතුය , මෙහි x යනු [0-9, af] M එකක් [1-5], සහ N [8, 9, a, හෝ b]
  • අහඹු ලෙස අඩු ගුණාත්මක ප්‍රභවයක් භාවිතා කිරීම (වැනි Math.random)

මේ අනුව, නිෂ්පාදන පරිසරයන් සඳහා කේත ලිවීමේ සංවර්ධකයින්ට uuid මොඩියුලය වැනි දැඩි, හොඳින් නඩත්තු කරන ලද ක්‍රියාත්මක කිරීමක් භාවිතා කිරීමට දිරිගන්වනු ලැබේ .


187
ඇත්ත වශයෙන්ම, අහඹු සංඛ්‍යා වලින් සාදන ලද UUIDs සඳහා RFC ඉඩ දෙයි. එය එසේ හඳුනා ගැනීම සඳහා ඔබට බිටු කිහිපයක් ඇඹරීමට සිදුවේ. 4.4 කොටස බලන්න. සැබවින්ම සසම්භාවී හෝ ව්‍යාජ සසම්භාවී අංක වලින් UUID නිර්මාණය කිරීම සඳහා ඇල්ගොරිතම: rfc-archive.org/getrfc.php?rfc=4122
ජේසන් ඩීෆොන්ටස්

මෙම ත්‍රෙඩ් එකේ ඇති සෑම දෙයක්ම දැනටමත් ගොඩනඟා ගනිමින්, මම පහත දැක්වෙන "ඊ 7" ප්‍රභේදයට වඩා දෙගුණයක් වේගවත්, ක්‍රිප්ටෝ-ශක්තිමත්, සහ සියලුම ප්‍රධාන බ්‍රව්සර් සහ නෝඩ් වල ක්‍රියා කරමි. මෙහි ඇතුළත් කිරීම ඉතා විශාල බැවින් 2020 මැයි 17 වන දින මගේ නම සමඟ නව පිළිතුරක් සොයන්න.
බෙනට් බැරූච්

node-uuid දැන් uuid බවට පත්ව ඇත (දෙවන ව්‍යාපෘතිය සමඟ ඒකාබද්ධ වීමෙන් පසුව)
Catweazle

4130

ගැනීම සඳහා RFC4122 වෙළුම 4 අනුකූල විසඳුමක්, මෙම එක්-ලයිනර් (සාක්ෂි ලැබී) විසඳුමක් වඩාත් සංයුක්ත මම සමග එන්න හැකි ය:

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()brevity සඳහා, කෙසේ වෙතත් Math.random()ඇත නොහැකි ඉහළ ගුණාත්මක RNG හතික. විස්තර සඳහා ඇඩම් හයිලන්ඩ්ගේ Math.random () හි විශිෂ්ට ලිවීම බලන්න. වඩා ශක්තිමත් විසඳුමක් සඳහා, උසස් තත්ත්වයේ RNG API භාවිතා කරන uuid මොඩියුලය භාවිතා කිරීම සලකා බලන්න .

යාවත්කාලීන කිරීම, 2015-08-26 : අතුරු සටහනක් ලෙස, ගැටුමේ නිශ්චිත සම්භාවිතාවක් කරා ළඟා වීමට පෙර හැඳුනුම්පත් කොපමණ ප්‍රමාණයක් ජනනය කළ හැකිද යන්න තීරණය කරන්නේ කෙසේද යන්න මෙම සාරාංශය විස්තර කරයි. උදාහරණයක් ලෙස, 3.26x10 15 අනුවාදය 4 RFC4122 UUIDs සමඟ ඔබට මිලියනයකට මිලියනයක ගැටීමේ අවස්ථාවක් තිබේ.

යාවත්කාලීන කිරීම, 2017-06-28 : ක්‍රෝම්, ෆයර්ෆොක්ස් සහ සෆාරි හි ගණිතයේ තත්වය පිළිබඳව සාකච්ඡා කරන ක්‍රෝම් සංවර්ධකයින්ගේ හොඳ ලිපියක් . tl; dr - 2015 අග වන විට එය “සෑහෙන්න හොඳයි”, නමුත් ගුප්ත ලේඛනකරණයේ ගුණාත්මකභාවය නොවේ. එම ගැටළුව විසඳීම සඳහා, ඊඑස් 6, cryptoඒපීඅයි සහ ජේඑස් විශාරද භාවිතා කරන ඉහත විසඳුමේ යාවත්කාලීන කළ අනුවාදයක් මෙහි මට ණය ලබා ගත නොහැක :

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

යාවත්කාලීන කිරීම, 2020-01-06 : JS භාෂාවේ කොටසක් ලෙස සම්මත මොඩියුලයක් සඳහා වැඩ වල යෝජනාවක් ඇතuuid



4
c මාක් - Math.random () හි ගුණාත්මකභාවය සැලකිලිමත් වේ. එක්ස් බ්රවුසරයේ පාහේ වෙනස් වන යටින් පවතින ක්රියාත්මක කිරීම පිළිබඳ සවිස්තරාත්මක විශ්ලේෂණයකින් තොරව, ision ට්ටනයේ සැබෑ අවාසි අපට දැනගත නොහැකිය. එබැවින් සරල බව සඳහා මම අහඹු ලෙස කදිම ප්‍රභවයක් උපකල්පනය කරමි. එහෙත්, ඔව්, එය භයානක උපකල්පනයක් විය හැකිය. Node-uuid ( github.com/broofa/node-uuid ) හි Math.random () ට වඩා ගුප්ත-ගුණාත්මක අහඹු බව සහතික කරන වෙනත් ඒපීඅයි වලට මම වැඩි කැමැත්තක් දක්වන්නේ එබැවිනි.
broofa

144
Ux මුක්සාගේ ප්‍රශ්නයට පිළිතුර 'නැත' යන්නයි. සේවාදායකයාගෙන් පැමිණි දෙයක් විශ්වාස කිරීම කිසි විටෙකත් සැබවින්ම ආරක්ෂිත නොවේ. මම හිතන්නේ එය ඔබගේ පරිශීලකයින්ට ජාවාස්ක්‍රිප්ට් කොන්සෝලයක් ගෙන ඒමට සහ විචල්‍යය අතින් වෙනස් කිරීමට අවශ්‍ය ප්‍රමාණයට වෙනස් වේ. නැතහොත් ඔවුන්ට අවශ්‍ය හැඳුනුම්පත නැවත ඔබට තැපැල් කළ හැකිය. පරිශීලකයා තමන්ගේම හැඳුනුම්පතක් තෝරාගැනීම අනාරක්ෂිතභාවයට හේතු වේද යන්න මත ද එය රඳා පවතී. කෙසේ හෝ වේවා, එය අහඹු සංඛ්‍යා හැඳුනුම්පතක් වගුවකට යන්නේ නම්, මම එය සේවාදායක පැත්තෙන් ජනනය කරනු ඇත, එවිට මට ක්‍රියාවලිය පාලනය කළ හැකි බව මම දනිමි.
කැම් ජැක්සන්

36
RewDrewNoakes - UUIDs යනු සම්පූර්ණයෙන්ම අහඹු # ගේ මාලාවක් නොවේ. "4" යනු uuid අනුවාදයයි (4 = "අහඹු"). Uuid ප්‍රභේදය (ක්ෂේත්‍ර පිරිසැලසුම, මූලික වශයෙන්) කාවැද්දිය යුතු තැන "y" සලකුණු කරයි. වැඩි විස්තර සඳහා ietf.org/rfc/rfc4122.txt හි 4.1.1 සහ 4.1.3 වගන්ති බලන්න .
broofa

5
ඇයි c== 'x'ඒ වෙනුවට c === 'x'. Jshint අසමත් නිසා.
ෆයිසර් ඛාන්

812

මම ඇත්තටම කැමතියි කොතරම් පිරිසිදුද කියලා බෘෆාගේ පිළිතුර , නමුත් දුර්වල ලෙස ක්‍රියාත්මක කිරීම Math.randomගැටුමට ඉඩ හැරීම අවාසනාවකි .

මෙන්න පළමු RX අංක 13 කාලරාමුවෙහි හෙක්ස් කොටසකින් ඕෆ්සෙට් කිරීමෙන් සහ පිටු පැටවීමෙන් පසු මයික්‍රෝ තත්පරයෙන් හෙක්ස් කොටසකින් ඕෆ්සෙට් ක්ෂය කිරීමෙන් එම ගැටළුව විසඳන සමාන RFC4122 අනුවාදය 4 අනුකූල විසඳුමක් මෙන්න. ඒ ආකාරයෙන්, Math.randomඑකම බීජයක වුවද, සේවාදායකයින් දෙදෙනාම පිටු පැටවීමෙන් පසු (මයික්‍රෝ තත්පර ගණනක් හරියටම UUID උත්පාදනය කළ යුතුය) (ඉහළ-පරිපූර්ණ කාලය සඳහා සහය දක්වන්නේ නම්) සහ හරියටම එකම මිලි තත්පරයට (හෝ අවුරුදු 10,000+ කට පසුව) එකම UUID ලබා ගන්න:

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


පරීක්ෂා කිරීම සඳහා මෙන්න.


31
මතක තබා ගන්න, new Date().getTime()සෑම මිලි තත්පරයක යාවත්කාලීන නොවේ. මෙය ඔබගේ ඇල්ගොරිතමයේ අපේක්ෂිත අහඹු භාවයට බලපාන්නේ කෙසේදැයි මට විශ්වාස නැත.
devios1

84
performance.now ඊටත් වඩා හොඳ වනු ඇත. Date.now මෙන් නොව, ආපසු ලබා දුන් කාලරාමු performance.now()මිලි තත්පර විභේදනයකට සීමා නොවේ. ඒ වෙනුවට, ඒවා කාලය මයික්‍රෝ තත්පර නිරවද්‍යතාවයකින් යුත් පාවෙන ලක්ෂ්‍ය සංඛ්‍යා ලෙස නිරූපණය කරයි . Date.now මෙන් නොව, performance.now () මඟින් ලබා දෙන අගයන් සෑම විටම නියත අනුපාතයකින් වැඩි වන අතර එය පද්ධති ඔරලෝසුවෙන් ස්වාධීනව අතින් සකස් කළ හැකිය.
daniellmb

6
andaniellmb ඔබ බොහෝ විට MDN හෝ වෙනත් සම්බන්ධ කර ඇත්තේ සැබෑ ලියකියවිලි පෙන්වීමට මිස පොලිෆිල් එකක් නොවේ;)
මාටින්

2
වටකුරු භාවිතය යනු කුමක්දැයි මට දැනගත d = Math.floor(d/16);හැකිද?
ප්‍රවීන්

2
Ra ප්‍රවීන් එම මෙහෙයුම කාලරාමුව එක් හෙක්ස්-ඉලක්කම් දකුණට හරවා ඉතිරි කොටස පහත වැටේ. එහි පරමාර්ථය වන්නේ අප දැන් භාවිතා කළ හෙක්ස් ඉලක්කම් ඉවත් කර ගැනීම (අවම වශයෙන් වැදගත් එකක්) සහ ඊළඟ ක්‍රියාවලිය සඳහා එය සූදානම් කිරීමයි.
බ්‍රිගු 37

431

බෘෆාගේ පිළිතුර ඉතා සිනිඳුයි, ඇත්තෙන්ම - ඉතා දක්ෂ, ඇත්තෙන්ම ... rfc4122 අනුකූල, තරමක් කියවිය හැකි සහ සංයුක්තයි. නියමයි!

නමුත් ඔබ එම නිත්‍ය ප්‍රකාශනය දෙස බලන්නේ නම්, එම බොහෝ replace()ඇමතුම්, toString()සහ Math.random()ක්‍රියාකාරී ඇමතුම් (එහිදී ඔහු ප්‍රති the ලයෙන් බිටු 4 ක් පමණක් භාවිතා කර ඉතිරි කොටස නාස්ති කරයි), ඔබ කාර්ය සාධනය ගැන කල්පනා කිරීමට පටන් ගත හැකිය. ඇත්ත වශයෙන්ම, ජොයෙල්ප්ට් විසින් සාමාන්‍ය GUID වේගය සඳහා RFC ඉවත් කිරීමට පවා තීරණය කළේය generateQuickGUID.

නමුත්, අපට වේගය සහ RFC අනුකූලතාවය ලබා ගත හැකිද? මම කියනවා, ඔව්! අපට කියවීමේ හැකියාව පවත්වා ගත හැකිද? හොඳයි ... ඇත්ත වශයෙන්ම නොවේ, නමුත් ඔබ අනුගමනය කරන්නේ නම් එය පහසුය.

නමුත් පළමුව, මගේ ප්‍රති results ල, බෘෆා හා සසඳන විට guid(පිළිගත් පිළිතුර) සහ ආර්එෆ්සී අනුකූල නොවන 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 වන ප්‍රශස්තිකරණය අනුව, මම වඩාත් ජනප්‍රිය පිළිතුර 12X ට වඩා , පිළිගත් පිළිතුර 9X ට වඩා , සහ වේගයෙන් නොගැලපෙන පිළිතුර 2-3X මගින් පරාජය කළෙමි. . මම තවමත් rfc4122 අනුකූලයි.

කෙසේද? මම සම්පූර්ණ මූලාශ්‍රය http://jsfiddle.net/jcward/7hyaC/3/ සහ http://jsperf.com/uuid-generator-opt/4 මත තබා ඇත

පැහැදිලි කිරීමක් සඳහා, අපි බ ro ෆාගේ කේතය සමඟ ආරම්භ කරමු:

function broofa() {
    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(broofa())

එබැවින් එය xඕනෑම අහඹු හෙක්ස් ඉලක්කම් yසමඟ, අහඹු දත්ත සමඟ ප්‍රතිස්ථාපනය කරයි ( 10RFC පිරිවිතරයට අනුව ඉහළම බිටු 2 බල කිරීම හැර ), සහ රීජෙක්ස් නොගැලපේ -හෝ4 අක්ෂර සමඟ , එබැවින් ඔහුට ඒවා සමඟ ගනුදෙනු කිරීමට අවශ්‍ය නැත. ඉතා සිනිඳුයි.

දැනගත යුතු පළමු දෙය නම් නිත්‍ය ප්‍රකාශන මෙන් ක්‍රියාකාරී ඇමතුම් මිල අධික බවය (ඔහු 1 ක් පමණක් භාවිතා කළද, එයට ඇමතුම් 32 ක් ඇත, සෑම තරඟයක් සඳහාම එකක් ඇත, සහ එක් එක් ඇමතුම් 32 න් එය Math.random () සහ v. toString (16)).

කාර්ය සාධනය සඳහා වන පළමු පියවර වන්නේ රෙජෙක්ස් සහ එහි ඇමතුම් ආපසු ගැනීමේ කාර්යයන් ඉවත් කර ඒ වෙනුවට සරල පුඩුවක් භාවිතා කිරීමයි. මෙයින් අදහස් කරන්නේ බෘෆා නොකළ නමුත් චරිත -හා 4චරිත සමඟ අප කටයුතු කළ යුතු බවයි. ඔහුගේ සිහින් නූල් අච්චු ගෘහ නිර්මාණ ශිල්පය තබා ගැනීමට අපට String Array දර්ශක භාවිතා කළ හැකි බව සලකන්න:

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

console.log(e1())

මූලික වශයෙන්, එකම අභ්‍යන්තර තර්කනය, අප පරීක්ෂා කිරීම -හෝ කාල 4ලූපයක් භාවිතා කිරීම හැර (ඒ වෙනුවටreplace() කෝල්බැක් ) අපට 3X කට ආසන්න වැඩිදියුණු කිරීමක් ලැබේ!

ඊළඟ පියවර ඩෙස්ක්ටොප් එකේ කුඩා එකක් නමුත් ජංගම දුරකථනයේ හොඳ වෙනසක් ඇති කරයි. අපි Math.random () ඇමතුම් අඩු කර එම අහඹු බිටු 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
}

console.log(e2())

වේදිකාව මත පදනම්ව මෙය අපට 10-30% ක් ඉතිරි කරයි. නරක නැහැ. නමුත් ඊළඟ විශාල පියවර ටෝස්ට්‍රිං ශ්‍රිත ඇමතුම් මුළුමනින්ම ප්‍රශස්තිකරණ සම්භාව්‍යයකින් ඉවත් කරයි - බැලීමේ වගුව. මූලද්‍රව්‍ය 16 කින් යුත් සරල බැලීමේ වගුවක් මඟින් ටෝස්ට්‍රිං (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
}

console.log(e4())

ඊළඟ ප්‍රශස්තිකරණය තවත් සම්භාව්‍යයකි. අපි එක් එක් ලූප පුනරාවර්තනයේ බිටු 4 ක නිමැවුමක් පමණක් හසුරුවන බැවින්, අපි ලූප ගණන අඩකින් කපා එක් එක් පුනරාවර්තනයේ බිටු 8 ක් සකස් කරමු. අපට තවමත් RFC අනුකූල බිට් ස්ථාන හැසිරවිය යුතු බැවින් මෙය ව්‍යාකූල ය, නමුත් එය එතරම් අපහසු නැත. 0x00 - 0xff ගබඩා කිරීම සඳහා අපට පසුව විශාල බැලීමේ වගුවක් (16x16, හෝ 256) සෑදිය යුතු අතර, අපි එය ගොඩනඟන්නේ 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
}

console.log(e5())

මම වරකට බිටු 16 ක් ක්‍රියාවට නංවන ඊ 6 () උත්සාහ කළෙමි, තවමත් මූලද්‍රව්‍ය 256 LUT භාවිතා කරමින්, එය ප්‍රශස්තිකරණයේ ප්‍රතිලාභ අඩුවෙමින් පවතින බව පෙන්නුම් කළෙමි. එය අඩු පුනරාවර්තන ප්‍රමාණයක් තිබුණද, වැඩි දියුණු කරන ලද සැකසුම් මගින් අභ්‍යන්තර තර්කනය සංකීර්ණ වූ අතර එය ඩෙස්ක්ටොප් පරිගණකයේද ක්‍රියාත්මක වූ අතර ජංගම දුරකතනයට වඩා ~ 10% ක් පමණි.

අයදුම් කිරීමට ඇති අවසාන ප්‍රශස්තිකරණ තාක්ෂණය - ලූපය ඉවත් කරන්න. අපි ස්ථාවර වාර ගණනක් ලූප කරන බැවින්, අපට තාක්‍ෂණිකව මේ සියල්ල අතින් ලිවිය හැකිය. මම නැවත වරක් පැවරූ තනි අහඹු විචල්‍ය 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];
}

console.log(e7())

නවීකරණය කරන ලද: http://jcward.com/UUID.js -UUID.generate()

හාස්‍යජනක දෙය නම්, අහඹු දත්ත බයිට් 16 ක් උත්පාදනය කිරීම පහසුම කොටසයි. සමස්ත උපක්‍රමයම එය RFC අනුකූලතාවයෙන් String ආකෘතියෙන් ප්‍රකාශ කරන අතර එය වඩාත් තදින් සපුරා ඇත්තේ අහඹු දත්ත බයිට් 16 ක්, පාලනය නොකළ ලූපයක් සහ බැලීමේ වගුවක් මගිනි.

මගේ තර්කනය නිවැරදි යැයි මම විශ්වාස කරමි - මේ ආකාරයේ වෙහෙසකර වැඩ වලදී වැරැද්දක් කිරීම ඉතා පහසුය. නමුත් ප්‍රතිදානයන් මට හොඳ පෙනුමක්. කේත ප්‍රශස්තිකරණය හරහා ඔබ මෙම පිස්සු ගමන භුක්ති වින්දා යැයි මම විශ්වාස කරමි!

අවවාද කරන්න: මගේ මූලික ඉලක්කය වූයේ විභව ප්‍රශස්තිකරණ උපාය මාර්ග පෙන්වීම සහ ඉගැන්වීමයි. වෙනත් පිළිතුරු මගින් හොඳ UUIDs උත්පාදනය සඳහා වැදගත් වන isions ට්ටන සහ සැබවින්ම අහඹු සංඛ්‍යා වැනි වැදගත් මාතෘකා ආවරණය කරයි.


14
මෙම කේතයේ තවමත් දෝෂ කිහිපයක් අඩංගු වේ: Math.random()*0xFFFFFFFFරේඛා Math.random()*0x100000000සම්පූර්ණ අහඹු >>>0ලෙස |0විය යුතු අතර, අගයන් අත්සන් නොකිරීම වෙනුවට භාවිතා කළ යුතුය (වත්මන් කේතය සමඟ අත්සන් කළද එය හරි යයි). අවසාන වශයෙන් window.crypto.getRandomValuesලබා ගත හැකි නම් භාවිතා කිරීම මේ දිනවල ඉතා හොඳ අදහසක් වනු ඇති අතර , අවශ්‍ය නම් පමණක් Math.random වෙත ආපසු යන්න. Math.random හි එන්ට්‍රොපිය බිටු 128 ට වඩා අඩු විය හැකි අතර, මෙය අවශ්‍ය ප්‍රමාණයට වඩා isions ට්ටනයට ගොදුරු වේ.
ඩේව්

මෙම ත්‍රෙඩ් එකේ දැනටමත් ඇති සෑම දෙයක්ම ගොඩනඟා ගනිමින්, මම "ඊ 7" මෙන් දෙගුණයක් වේගයෙන් යමක් ගොඩනගා ඇත්තෙමි, නෝඩ් ඇතුළු සියලු පරිසරයන් අතේ ගෙන යා හැකි අතර Math.random () සිට ක්‍රිප්ටෝ-ශක්තිය අහඹු ලෙස උසස් කර ඇත. Uuid හට ගුප්ත ශක්තිය අවශ්‍ය යැයි ඔබ නොසිතනු ඇත, නමුත් එයින් අදහස් කරන්නේ ision ට්ටනයකට ඊටත් වඩා අඩු අවස්ථාවක් වන අතර එය uuid හි සමස්ත ලක්ෂ්‍යයයි. අදහස් දැක්වීමකට සරිලන තරම් විශාල, මම එය වෙන වෙනම පළ කර ඇත්තෙමි.
බෙනට් බැරූච්

165

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

4
ඔබ GUID ගොඩනඟන විට එය ගතිකව ප්‍රමාණයට වඩා අරා ප්‍රමාණය කලින් ප්‍රකාශ කළ යුතුය. var s = new Array(36);
MgSam

1
මම හිතන්නේ රේඛාවේ ඉතා සුළු දෝෂයක් ඇති අතර එය ඔරලෝසුවේ 6-7 බිටු 0-7 ලෙස සකසා ඇත. S [19] '0' .. 'f' අක්ෂරයක් වන අතර එය 0x0..0xf, (s) [19] & 0x3) | 0x8 අහඹු ලෙස බෙදා හරිනු නොලැබේ - එය වැඩි '9 හා අඩු' බී නිපදවීමට නැඹුරු වනු ඇත. මෙය වෙනසක් කරන්නේ ඔබ කිසියම් හේතුවක් නිසා අහඹු ලෙස බෙදා හැරීම ගැන සැලකිලිමත් වන්නේ නම් පමණි.
ජෝන් වේලෝනිස්

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

හැඳුනුම්පත් මිලි තත්පර 1 ට වඩා ජනනය කරන්නේ නම්, ඒවා 100% අද්විතීය වේ.

හැඳුනුම්පත් දෙකක් කෙටි කාල පරාසයකින් ජනනය කර, අහඹු ක්‍රමය සැබවින්ම අහඹු යැයි උපකල්පනය කරන්නේ නම්, මෙය 99.99999999999999% ක් වන හැඳුනුම්පත් ගෝලීයව අද්විතීය වීමට ඉඩ ඇත (10 ^ 15 න් 1 ක ision ට්ටනය)

තවත් ඉලක්කම් එකතු කිරීමෙන් ඔබට මෙම සංඛ්‍යාව වැඩි කළ හැකි නමුත් 100% අද්විතීය හැඳුනුම්පත් ජනනය කිරීමට ඔබට ගෝලීය කවුන්ටරයක් ​​භාවිතා කිරීමට අවශ්‍ය වනු ඇත.

ඔබට RFC අනුකූලතාවයක් අවශ්‍ය නම්, මෙම ආකෘතිකරණය වලංගු අනුවාදය 4 GUID ලෙස සම්මත වේ:

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

සංස්කරණය කරන්න: ඉහත කේතය අභිප්‍රාය අනුගමනය කරයි, නමුත් RFC හි ලිපිය නොවේ. වෙනත් විෂමතා අතර එය අහඹු ඉලක්කම් කිහිපයක් කෙටි වේ. (ඔබට අවශ්‍ය නම් තවත් අහඹු ඉලක්කම් එකතු කරන්න) උඩු යටිකුරු වන්නේ මෙය සැබවින්ම වේගවත් වීමයි :) ඔබේ GUID වල වලංගුභාවය මෙහි පරීක්ෂා කළ හැකිය


4
මෙය UUID නොවේද?
මාකෝ කෙර්විට්ස්

UUID / GUID යනු බිට් 122 (+ වෙන් කළ බිටු හයක්) අංකයකි. එය ගෝලීය කවුන්ටර සේවාවක් හරහා සුවිශේෂත්වය සහතික කළ හැකි නමුත් බොහෝ විට එය වේලාව, MAC ලිපිනය සහ අහඹු බව මත රඳා පවතී. UUID හි අහඹු නොවේ! මම මෙහි යෝජනා කරන UID සම්පූර්ණයෙන්ම සම්පීඩිත නොවේ. ඔබට එය සම්පීඩනය කළ හැකිය, බිට් 122 ක පූර්ණ සංඛ්‍යාවක් සඳහා, පූර්ව නිශ්චිත බිටු 6 ක් සහ අමතර අහඹු බිටු එකතු කරන්න (ටයිමර් බිටු කිහිපයක් ඉවත් කරන්න) සහ ඔබ අවසන් වන්නේ පරිපූර්ණ ලෙස සැකසූ UUID / GUID සමඟිනි, එවිට ඔබට හෙක්ස් බවට පරිවර්තනය විය යුතුය. හැඳුනුම්පතේ දිගට අනුකූල වීම හැර වෙනත් කිසිවක් එකතු නොකරන මට.
සයිමන් රිගට්

5
අතථ්‍ය යන්ත්‍රවල සුවිශේෂත්වය සඳහා MAC ලිපින යැවීම නරක අදහසකි!
සයිමන් රිගට්

1
මම මේ වගේ දෙයක් කරනවා, නමුත් ප්‍රධාන චරිත සහ සමහර ඉර සහිත (උදා: [slug, date, random].join("_")නිර්මාණය කිරීම usr_1dcn27itd_hj6onj6phr. එමඟින් එය හැඳුනුම්පත "නිර්මාණය කරන ලද" ක්ෂේත්‍රයක් ලෙස දෙගුණ කරයි
සෙප් රීඩ්

95

ආකෘතියේ නූල් උත්පාදක ක්‍රමය වැනි වේගවත්ම GUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. මෙය සම්මත අනුකූල GUID ජනනය නොකරයි.

මෙම ක්‍රියාවට නැංවීම මිලියන දහයක් ගත වන්නේ තත්පර 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');

මම එහි කළ දේ ඔබගෙන් බොහෝ දෙනෙකුට වැටහෙනු ඇතැයි මට විශ්වාසයි, නමුත් පැහැදිලි කිරීමක් අවශ්‍ය අවම වශයෙන් එක් පුද්ගලයෙකු හෝ සිටිය හැකිය:

ඇල්ගොරිතම:

  • මෙම Math.random()කාර්යය උදාහරණයක් (දශම භාග ස්ථානය පසු ඉලක්කම් 16 ක් සමග 0 හා 1 අතර දශම සංඛ්යාව නැවත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"), ඉන්පසු එය දෙවන දර්ශකයෙන් (3 වන අක්‍ෂරයෙන්) අක්ෂර අටක දිගකින් කපා දැමිය යුතුය. ඉතිරි අවස්ථා සඳහා, ශුන්‍ය එකතු කිරීම ප්‍රති result ලයට හානියක් නොකරන්නේ එය කෙසේ හෝ කපා හැරීම නිසාය.
    Math.random().toString(16)+"000000000").substr(2,8).

එකලස් කිරීම:

  • GUID පහත ආකෘතියේ XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXඇත.
  • මම GUID කැබලි 4 කට බෙදුවෙමි, සෑම කැබැල්ලක්ම වර්ග 2 කට බෙදා ඇත (හෝ ආකෘති): XXXXXXXXසහ -XXXX-XXXX.
  • දැන් මම, ඇමතුම් 4 කෑලි සමග GUID එකලස් කිරීමට මෙම වර්ග 2 භාවිතා කරමින් GUID හදන පහත කරනවා: XXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX.
  • මෙම වර්ග දෙක අතර වෙනස සඳහා, මම යුගල නිර්මාපක ශ්‍රිතයකට ධජ පරාමිතියක් එක් කළෙමි _p8(s), sපරාමිතිය මඟින් ඉරක් එකතු කළ යුතුද නැද්ද යන්න ශ්‍රිතයට කියයි.
  • අවසානයේදී අපි පහත දැක්වෙන දම්වැලෙන් GUID ගොඩනඟමු: _p8() + _p8(true) + _p8(true) + _p8()එය ආපසු දෙන්න.

මගේ බ්ලොග් අඩවියේ මෙම සටහනට සබැඳිය

විනෝද වන්න! :-)


13
මෙම ක්‍රියාත්මක කිරීම වැරදිය. GUID හි සමහර අක්ෂර සඳහා විශේෂ ප්‍රතිකාර අවශ්‍ය වේ (උදා: 13 වන ඉලක්කම් අංක 4 විය යුතුය).
JLRishe

67

ක්‍රෝම් හි isions ට්ටන සඳහා විසඳුමක් සමඟ ඉහළම ඡන්දය දුන් පිළිතුරේ එකතුවක් මෙන්න :

generateGUID = (typeof(window.crypto) != 'undefined' && 
                typeof(window.crypto.getRandomValues) != 'undefined') ?
    function() {
        // If we have a cryptographically secure PRNG, use that
        // /programming/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
        // /programming/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 මත .


3
පළමු අනුවාදය වන ` , does not keep the Version 4 UUIDs format defined by RFC 4122. That is instead of window.crypto.getRandomValues ​​xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxx` එය ලබා දෙන බව සලකන්න xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
humanityANDpeace

66

ASCII- ආරක්ෂිත GUID වැනි අද්විතීය හඳුනාගැනීමක් ජනනය කිරීම සඳහා මුළුමනින්ම අනුකූල නොවන නමුත් ඉතා ක්‍රියාකාරී ලෙස ක්‍රියාත්මක කිරීම මෙන්න.

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

අක්ෂර 26 [a-z0-9] ජනනය කරන අතර, UID එකක් නිපදවන අතර එය RFC අනුකූල GUID වලට වඩා කෙටි හා අද්විතීය වේ. මිනිස් කියවීමේ හැකියාව වැදගත් නම් ඉර සුළු වශයෙන් එකතු කළ හැකිය.

මෙන්න මෙම ශ්‍රිතය සඳහා භාවිත උදාහරණ සහ වේලාවන් සහ මෙම ප්‍රශ්නයේ වෙනත් පිළිතුරු කිහිපයක්. කාල නියමය ක්‍රෝම් එම් 25 යටතේ සිදු කරන ලදී.

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

62

Https://gist.github.com/982883 හි පරිශීලක ජෙඩ් විසින් කරන ලද අදහස් දැක්වීමකින් 2011 ඔක්තෝබර් 9 දිනැති විසඳුමක් මෙන්න :

UUIDv4 = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}

මෙය වර්තමාන ඉහළම ශ්‍රේණිගත පිළිතුරට සමාන ඉලක්කයක් සපුරා ගනී , නමුත් බලහත්කාරය, පුනරාවර්තනය සහ on ාතීය අංකනය සූරාකෑමෙන් බයිට් 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
      )
}

52

සිට 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;
}

ඇක්ටිව්එක්ස් පාලනයක් භාවිතා කිරීම සඳහා වෙනත් ක්‍රම තිබේ, නමුත් මේවායින් stay ත්ව සිටින්න!

සංස්කරණය කරන්න: කිසිම GUID උත්පාදක යන්ත්‍රයකට අද්විතීය යතුරු සහතික කළ නොහැකි බව පෙන්වා දීම වටී යැයි මම සිතුවෙමි ( විකිපීඩියා ලිපිය බලන්න ). සෑම විටම ගැටුම් ඇතිවීමේ අවස්ථාවක් තිබේ. GUID මඟින් යතුරු විශාල ප්‍රමාණයක් ලබා දෙයි.


8
මෙය තාක්ෂණික අර්ථයෙන් GUID එකක් නොවන බව සලකන්න, මන්ද එය සුවිශේෂත්වය සහතික කිරීමට කිසිවක් නොකරන බැවිනි. ඔබගේ යෙදුම අනුව එය වැදගත් හෝ නොවිය හැකිය.
ස්ටීවන් ඩෙකන්

2
කාර්ය සාධනය පිළිබඳ ඉක්මන් සටහනක්. මෙම විසඳුම තනි ප්‍රති .ලයක් ලබා ගැනීම සඳහා නූල් 36 ක් නිර්මාණය කරයි. කාර්ය සාධනය ඉතා වැදගත් නම්, නිර්දේශ කර ඇති පරිදි අරාවක් නිර්මාණය කිරීම හා සම්බන්ධ වීම සලකා බලන්න: tinyurl.com/y37xtx වැඩිදුර පර්යේෂණ වලින් පෙන්නුම් කරන්නේ එය වැදගත් නොවන බවයි, එබැවින් YMMV: tinyurl.com/3l7945
Brandon DuRette

2
සුවිශේෂත්වය සම්බන්ධයෙන් ගත් කල, 1,3 අනුවාදය සහ UUID 5 ක් 4 වන අනුවාදය නොවන ආකාරවලින් නිර්ණායක බව සඳහන් කිරීම වටී. මෙම uuid උත්පාදක යන්ත්ර සඳහා යෙදවුම් - v1 හි node id, v3 සහ v5 හි නම් අවකාශය සහ නම අද්විතීය නම් (ඒවා විය යුතු යැයි සිතන පරිදි), එවිට ලැබෙන UUIDs අද්විතීය වේ. න්‍යාය අනුව, කෙසේ හෝ.
broofa

42

ඔබට node-uuid භාවිතා කළ හැකිය ( https://github.com/kelektiv/node-uuid )

RFC4122 UUIDS හි සරල, වේගවත් උත්පාදනය .

විශේෂාංග:

  • RFC4122 අනුවාදය 1 හෝ 4 UUID අනුවාදය ජනනය කරන්න
  • Node.js සහ බ්‍රව්සර් වල ධාවනය වේ.
  • ආධාරක වේදිකා මත ගුප්ත විද්‍යාත්මකව ශක්තිමත් අහඹු # පරම්පරාව.
  • කුඩා අඩිපාර (කුඩා දෙයක් අවශ්‍යද? මෙය පරීක්ෂා කරන්න! )

එන්පීඑම් භාවිතයෙන් ස්ථාපනය කරන්න:

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

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

සංස්කරණය කරන්න:

මෙම ශ්‍රිතය භාවිතා කරන මගේ ව්‍යාපෘතිය නැවත බැලූ අතර වාචික භාවය අකමැති විය. - නමුත් නිසි අහඹු බවක් අවශ්‍යයි.

බ්‍රිගුයි 37 ගේ පිළිතුර මත පදනම් වූ අනුවාදයක් සහ ස්වල්ප ප්‍රමාණයේ කවුළු බෆරයෙන් නිස්සාරණය කිරීම.

ජාවා හි UUID සමඟ නොගැලපෙන uuids විග්‍රහ කිරීමේදී මට අවසාන වරට ගැටළු ඇති බැවින් RFC Type 4 (අහඹු) යෝජනා ක්‍රමයට අනුගත විය යුතුය.


31

මෙම ත්‍රෙඩ් එකේ ඇති හොඳම පිළිතුරු එකතුවක් ලෙස සරල ජාවාස්ක්‍රිප්ට් මොඩියුලය.

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

"00000000-0000-0000-0000-000000000000"


1
දේ ගැන කරදර වන්නේ සියලු පිළිතුරු එය බව පෙනේ වේ හරි JavaScript මෙම ගබඩා කිරීම සඳහා GUIDලෙස string. අවම වශයෙන් සටන් වදින දී ඔබගේ පිළිතුර බොහෝ වඩාත් කාර්යක්ෂම ගබඩා භාවිතා Uint16Array. මෙම toStringඋත්සවයේ දී JavaScript දී, ද්විමය නිරූපණය භාවිතා කළ යුතුobject
සෙබස්තියන්

මෙම කේතය මඟින් නිපදවන මෙම UUIDs දුර්වල-නමුත්-RFC- අනුකූල (_guid), හෝ ශක්තිමත්-නමුත්-RFC- අනුකූල නොවන (_cryptoGuid) වේ. කලින් භාවිතා කළ Math.random () භාවිතා කරයි, එය දැන් දුර්වල RNG ලෙස හැඳින්වේ. දෙවැන්න අනුවාදය සහ ප්‍රභේදන ක්ෂේත්‍ර සැකසීමට අසමත් වීමයි.
broofa

robroofa - එය ශක්තිමත් සහ RFC අනුකූල වීමට ඔබ යෝජනා කරන්නේ කුමක්ද? _CryptoGuid RFC අනුකූල නොවන්නේ ඇයි?
මැට්

Att මැට් _ක්‍රිප්ටොගුයිඩ් () සියලු බිටු 128 අහඹු ලෙස සකසයි, එයින් අදහස් කරන්නේ එය RFC හි විස්තර කර ඇති පරිදි අනුවාදය සහ ප්‍රභේදන ක්ෂේත්‍ර සැකසෙන්නේ නැති බවයි. ශක්තිමත් + අනුකූල ක්‍රියාත්මක කිරීමක් සඳහා ඉහත මගේ ඉහළ ඡන්දය දුන් පිළිතුරේ crypto.getRandomValues ​​() භාවිතා කරන uuidv4 () හි විකල්ප ක්‍රියාත්මක කිරීම බලන්න.
බ්‍රෝෆා

29

මෙය 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

28

හොඳයි, මේ වන විටත් පිළිතුරු පොකුරක් ඇත, නමුත් අවාසනාවකට පොකුරේ "සත්‍ය" අහඹු සිදුවීමක් නොමැත. පහත අනුවාදය බෘෆාගේ පිළිතුර අනුවර්තනයකි, නමුත් ලබා ගත හැකි තැනක ක්‍රිප්ටෝ පුස්තකාල භාවිතා කරන “සත්‍ය” අහඹු ශ්‍රිතයක් ඇතුළත් කිරීමට යාවත්කාලීන කරන ලද අතර ඇලියා () ක්‍රියාකාරීත්වය පසුබෑමක් ලෙස ක්‍රියා කරයි.

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

27

GitHub හි ජාවාස්ක්‍රිප්ට් ව්‍යාපෘතිය - https://github.com/LiosK/UUID.js

UUID.js ජාවාස්ක්‍රිප්ට් සඳහා RFC අනුකූල UUID උත්පාදක යන්ත්රය.

RFC 4122 බලන්න http://www.ietf.org/rfc/rfc4122.txt .

විශේෂාංග RFC 4122 අනුකූල UUIDs ජනනය කරයි.

අනුවාදය 4 UUIDs (අහඹු අංක වලින් UUIDs) සහ 1 වන UUIDs (කාලය මත පදනම් වූ UUIDs) ඇත.

UUID වස්තුව UUID ක්ෂේත්‍රයට ප්‍රවේශය ඇතුළුව UUID වෙත විවිධ ප්‍රවේශයන් සඳහා ඉඩ ලබා දේ.

ජාවාස්ක්‍රිප්ට් හි අඩු කාලරාමු විභේදනය අහඹු සංඛ්‍යා මගින් වන්දි ලබා දේ.


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

16

මට බෘෆාගේ පිළිතුර තේරුම් ගැනීමට අවශ්‍ය විය, එබැවින් මම එය පුළුල් කර අදහස් දැක්වීම් එකතු කළෙමි:

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

සවිස්තරාත්මක විස්තරයට ස්තූතියි! සමාන පැහැදිලි කිරීම් සහිතව නිශ්චිතවම 8 සිට 11 දක්වා කූඩුවල කූඩු කිරීම ඉතා ප්‍රයෝජනවත් වේ.
ඊගෝර් ලිට්වින්චුක්

15

මගේම UUID / GUID උත්පාදක යන්ත්රය මෙහි අමතර කිහිපයක් සමඟ සකසා ඇත .

මම පහත දැක්වෙන 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));

15

Rfc4122 වෙළුම 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() );

ඉහත ශ්‍රිතයට වේගය සහ අහඹු බව අතර හොඳ සමබරතාවයක් තිබිය යුතුය.


13

ES6 නියැදිය

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

12

වඩා හොඳ ක්‍රමය:

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}

12

විකෘති දෙකක් සහිත තවත් කියවිය හැකි ප්‍රභේදයකි.

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

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

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

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

බොහෝ ජේඑස් දේව්ස් වෙබ් සංවර්ධකයින් වන අතර, බිට්වේස් ක්‍රියාකරුවන් කරන්නේ කුමක්දැයි අපට නොතේරේ, මන්ද අප සංවර්ධනය කරන බොහෝ විට ඒවා භාවිතා නොකරන බැවිනි. ඇත්තටම මට ඔවුන්ගෙන් කිසිවෙකු අවශ්‍ය නොවූ අතර මම '97 සිට ජේ.එස්. එබැවින් ඔබේ උදාහරණ කේතය එය කියවන සාමාන්‍ය වෙබ් සංවර්ධකයාට තවමත් සම්පූර්ණයෙන්ම කියවිය නොහැක. ඔබ තවමත් තනි අකුරු විචල්‍ය නම් භාවිතා කරන බව සඳහන් නොකිරීම නිසා එය වඩාත් ගුප්ත වේ. පිරිසිදු කේතය කියවන්න, සමහර විට එය උපකාරී වනු ඇත: amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/…
inf3rno

thread inf3rno ඔහුට පහර නොදෙන්න, මෙම ත්‍රෙඩ් එකේ යෝජිත විසඳුම් සියල්ලම ගුප්ත ය, නමුත් ඒවා නිවැරදි පිළිතුරු නම් ප්‍රශ්නය සලකා බැලීමේදී එක් ලයිනර් වර්ගයක් තිබීමයි. ඒක ලයිනර් ගුප්තයි. සාමාන්‍ය සංවර්ධකයාට කියවිය හැකි ලෙස ඔවුන්ට දරාගත නොහැකි නමුත් සරල පූර්ව අදහස් දැක්වීමක් කළ හැකි දේපළ වෙළඳාම් තිර සුරකිති. එහි ප්‍රති result ලයක් ලෙස, එය වඩාත් කියවිය හැකි ආකාරයෙන් අවසන් වන අතර එය “කියවිය හැකි කේතයක්” තුළ තිබුනේ නම්.
tatsu

සසම්භාවී! = අද්විතීය
පරිශීලක 1529413

@ user1529413 ඔව්. සුවිශේෂත්වය සඳහා දර්ශකයක් අවශ්‍ය වේ.
ceving

මෙය මගේ ප්‍රියතම පිළිතුරයි, මන්ද එය UUID එකක් බයිට් 16 (බිට් 128) අගයක් ලෙස ගොඩනඟා ඇති අතර එහි අනුක්‍රමික නොවන, කියවීමට හොඳ ආකෘතියක් නොවේ. නූල් දේවල් අතහැර දමා අහඹු 128bit හි නිවැරදි බිටු සැකසීම සුළුපටු පහසුය, ඒ සියල්ලම uuidv4 විය යුතුය. ඔබට එය කෙටි URL සඳහා පදනම් 64 ක් විය හැකිය, එය නැවත යම් වෙබ්සෙම්බල් එකකට යැවිය හැකිය, එය නූලකට වඩා අඩු මතක අවකාශයක ගබඩා කර, එය 4096 ප්‍රමාණයේ බෆරයක් බවට පත් කර එහි uuids 256 ක් තැබිය හැකිය, බ්‍රව්සරයේ ගබඩා කරන්න db යනාදිය. ආරම්භයේ සිටම සෑම දෙයක්ම කුඩා, කුඩා හෙක්ස් කේතනය කරන ලද නූලක් ලෙස තබා ගැනීමට වඩා.
ජෝෂ් කරිබෝ

11

මම දන්නවා, එය පැරණි ප්‍රශ්නයක්. සම්පූර්ණත්වය සඳහා, ඔබේ පරිසරය ෂෙයාර්පොයින්ට් නම්, SP.Guid.newGuid( msdn link ) නමින් උපයෝගිතා ශ්‍රිතයක් ඇත, එය නව මාර්ගෝපදේශයක් නිර්මාණය කරයි. මෙම ශ්‍රිතය 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;
};

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

11

සහාය දක්වන බ්‍රව්සර්වල භාවිතා crypto.getRandomValues(a)කරන සරල කේතය (IE11 +, iOS7 +, FF21 +, Chrome, Android Chrome). භාවිතා වැලකී සිටීමේ බව ගැටුම් (උදාහරණයක් වශයෙන් සැබෑ තත්වය තුල ජනනය uuids 4000 සඳහා ගැටුම් 20 ඇති කර ගත හැකි නිසා Muxa ).Math.random()

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

සටහන්:

  • කේත කියවීමේ වේගය සඳහා ප්‍රශස්තිකරණය නොකෙරේ, තත්පරයට යූයිඩ් සිය ගණනක් පැවසීමට සුදුසුය. කාර්ය සාධනය මැනීම සඳහා http://jsbin.com/fuwigo/1 භාවිතා කරමින් මගේ ලැප්ටොප් පරිගණකයේ ක්‍රෝමියම් තත්පරයට 10000 ක් පමණ උත්පාදනය කරයි .
  • "Y" සඳහා 8 පමණක් භාවිතා කරයි, මන්ද එය කේත කියවීමේ හැකියාව සරල කරයි (y 8, 9, A හෝ B වීමට අවසර ඇත).

11

ඔබට විශේෂිත ආකෘතියකින් අහඹු 128 බිට් නූල් අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය:

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

එය වැනි දෙයක් නැවත ලබා දෙනු ඇත 2350143528-4164020887-938913176-2513998651.


BTW, එය සංඛ්‍යා පමණක් නොව අක්ෂර පමණක් ජනනය කරන්නේ ඇයි? වඩා අඩු ආරක්ෂිතයි
vsync

1
ඔබට මේ වගේ අක්ෂර (අකුරු) එකතු කළ හැකිය:Array.from((window.crypto || window.msCrypto).getRandomValues(new Uint32Array(4))).map(n => n.toString(16)).join('-')
magikMaker

8

හරි, uuid පැකේජය භාවිතා කරමින් , එය 1, 3, 4 සහ 5 UUID සඳහා සහය දක්වයි :

yarn add uuid

ඊළගට:

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

සම්පුර්ණයෙන්ම නිශ්චිත විකල්ප සමඟ ඔබට එය කළ හැකිය:

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

වැඩි විස්තර සඳහා, මෙහි npm පිටුවට පිවිසෙන්න


6

මේ සඳහා ඔබේම දෑ කසයෙන් තළනවා වෙනුවට දායකයින් 1 කට වඩා වැඩි ප්‍රමාණයක් විසින් හොඳින් පරීක්ෂා කරන ලද කේතයක් භාවිතා කිරීම වැදගත්ය. එක්ස් බ්‍රව්සරයේ වැඩ කළ හැකි කෙටිම දක්ෂ අනුවාදයට වඩා ස්ථායී කේතයකට වැඩි කැමැත්තක් දැක්වීමට ඔබට අවශ්‍ය ස්ථානවලින් එකක් මෙය වන නමුත් Y හි අනන්‍යතාවන් සැලකිල්ලට නොගනී. සමහර පරිශීලකයින් සඳහා. පුද්ගලිකව මම https://github.com/aurigadl/uuid-js හි uuid-js භාවිතා කරන අතර එමඟින් සක්‍රීය කර ඇති නිසා මට පහසුවෙන් යාවත්කාලීනයන් ලබා ගත හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.