জিইউইডি / ইউইউডি কীভাবে তৈরি করবেন?


4172

আমি জাভাস্ক্রিপ্টে বিশ্বব্যাপী-অনন্য শনাক্তকারী তৈরি করার চেষ্টা করছি। আমি নিশ্চিত নই যে সমস্ত ব্রাউজারগুলিতে কী রুটিনগুলি পাওয়া যায়, কীভাবে "এলোমেলো" এবং অন্তর্নির্মিত এলোমেলো সংখ্যা জেনারেটর ইত্যাদি বীজযুক্ত etc.

জিইউইডি / ইউইউডি কমপক্ষে 32 টি অক্ষর হওয়া উচিত এবং এগুলি পাস করার সময় সমস্যা এড়াতে ASCII সীমার মধ্যে থাকা উচিত।


13
স্ট্রিং হিসাবে কমপক্ষে ৩ are টি লম্বায় 38 টির বেশি অক্ষরের আকার হিসাবে উপস্থিত হয়ে জিইউইউডিগুলি a \ {? [A-zA-Z0-9] {36}? \} $ প্যাটার্নটির সাথে মেলে এবং তাই সর্বদা আসকি হয়।
অ্যান্থনিডাব্লু জোন্স

2
দায়ূদের Bau অনেক ভালো, seedable র্যান্ডম সংখ্যা উত্পাদক উপলব্ধ davidbau.com/archives/2010/01/30/... আমি UUID জানা উৎপাদিত করার জন্য একটি কিছুটা ভিন্ন পদ্ধতির আপ লিখেছেন blogs.cozi.com/tech/2010/04/generating- uuids-in-javascript.html
জর্জ ভি। রিলি

অদ্ভুত যে কেউ এখনও এটি উল্লেখ করেনি তবে সম্পূর্ণতার জন্য, এনপিএম-এ গাইড জেনারেটরগুলির আধিক্য রয়েছে আমি তাদের বেশিরভাগ ব্রাউজারে কাজ করতে বাজি রাখতে ইচ্ছুক।
জর্জ মাউয়ার

উত্তর:


2335

আরএফসি 4122 অনুসারে জিআইডিউ (বিশ্বব্যাপী ইউনিক আইডেন্টিফায়ার) নামে পরিচিত ইউআইডিগুলি (সর্বজনীন ইউনিক আইডেন্টিফায়ার) হ'ল নির্দিষ্ট স্বাতন্ত্র্যতা গ্যারান্টি সরবরাহ করতে ডিজাইনকারী identif

যদিও জেএসের কয়েকটি লাইনে একটি আরএফসি- সম্মতিযুক্ত ইউআইডিগুলি বাস্তবায়ন করা সম্ভব (যেমন নীচে @ ব্রুফার উত্তর দেখুন) এখানে বেশ কয়েকটি সাধারণ সমস্যা রয়েছে:

  • অবৈধ আইডি ফর্ম্যাট (ইউআইডিগুলি অবশ্যই " xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" ফর্মের হওয়া আবশ্যক , যেখানে x [0-9, এফ] এর মধ্যে একটি এম , [1-5] এর মধ্যে একটি এবং এন [8, 9, এ, বা বি]]
  • এলোমেলোতার নিম্ন মানের মানের উত্স ব্যবহার (যেমন Math.random)

সুতরাং, উত্পাদনের পরিবেশের জন্য কোড লেখার বিকাশকারীদের uuid মডিউলের মতো কঠোর, সু-রক্ষণাবেক্ষণ বাস্তবায়ন ব্যবহার করতে উত্সাহ দেওয়া হয় ।


186
আসলে, আরএফসি ইউআইডিগুলিকে অনুমতি দেয় যা এলোমেলো সংখ্যা থেকে তৈরি করা হয়। এটিকে হিসাবে চিহ্নিত করতে আপনাকে কয়েকটি বিট বার করতে হবে। বিভাগ 4.4 দেখুন। সত্যিকারের র্যান্ডম বা সিউডো-র্যান্ডম নম্বর থেকে একটি ইউইউডি
জেসন ডিফোনটেস

ইতিমধ্যে এই থ্রেডের সমস্ত কিছুর উপর ভিত্তি করে, আমি এমন একটি সংস্করণ তৈরি করেছি যা নীচে "ই 7" ভেরিয়েন্টের চেয়ে দ্বিগুণ দ্রুত, ক্রিপ্টো-শক্তিশালী এবং সমস্ত বড় ব্রাউজার এবং নোডে কাজ করে। এটি এখানে অন্তর্ভুক্ত করা খুব বড়, সুতরাং আমার নামের সাথে একটি নতুন উত্তর সন্ধান করুন মে 17, 2020-এ
বেনেট বারৈচ

নোড-ইউইড এখন ইউউইড হয়ে গেছে (পরবর্তী প্রকল্পের সাথে মিশে যাওয়ার পরে)
ক্যাটউইজলে

4104

একটি আরএফসি 4122 সংস্করণ 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 : সচেতন থাকুন যে ইউইউডি স্বতন্ত্রতা অন্তর্নিহিত এলোমেলো সংখ্যা জেনারেটর (আরএনজি) এর উপর খুব বেশি নির্ভর করে। ব্যবহারসমূহ উপরে সমাধান Math.random()সংক্ষিপ্ততা জন্য অবশ্য Math.random()হয় না একটি উচ্চ মানের RNG হতে নিশ্চিত। বিস্তারিত জানার জন্য ম্যাথ.রেন্ডম () এ অ্যাডাম হিল্যান্ডের দুর্দান্ত লিখনআপ দেখুন। আরও শক্তিশালী সমাধানের জন্য, uuid মডিউলটি ব্যবহার করুন , যা উচ্চ মানের মানের আরএনজি এপিআই ব্যবহার করে।

আপডেট, 2015-08-26 : একটি পার্শ্ব-নোট হিসাবে, এই সংক্ষেপে সংঘর্ষের নির্দিষ্ট সম্ভাবনা পৌঁছানোর আগে কতটি আইডি তৈরি করা যায় তা নির্ধারণ করতে হবে তা বর্ণনা করে। উদাহরণস্বরূপ, 3.26x10 15 সংস্করণ 4 আরএফসি 4122 ইউআইডিগুলির সাথে আপনার 1 মিলিয়ন মিলিয়ন সংঘর্ষ হওয়ার সম্ভাবনা রয়েছে।

আপডেট, 2017-06-28 : ক্রোম, ফায়ারফক্স এবং সাফারিতে ম্যাথ.রান্ডম পিআরএনজি মানের অবস্থা নিয়ে ক্রোম বিকাশকারীদের একটি ভাল নিবন্ধ । tl; dr - ২০১৫ সালের শেষের দিকে এটি "বেশ ভাল" তবে ক্রিপ্টোগ্রাফিক মানের নয়। এই সমস্যাটির সমাধানের জন্য, এখানে উপরের সমাধানটির একটি আপডেট সংস্করণ রয়েছে যা ES6, cryptoAPI, এবং JS উইজার্ডারি ব্যবহার করে যা আমি এর জন্য ক্রেডিট নিতে পারি না :

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

console.log(uuidv4());

আপডেট, 2020-01-06 : জেএস ভাষার অংশ হিসাবে একটি স্ট্যান্ডার্ড মডিউলটির জন্য কাজ করার প্রস্তাব রয়েছেuuid


30
আমি প্রায় দুর্ঘটনায় একটি প্রশ্ন পোস্ট stackoverflow.com/questions/6906916/...
Muxa

4
@ মার্ক - ম্যাথ.রেন্ডম () এর গুণমান একটি উদ্বেগজনক। তবে অন্তর্নিহিত বাস্তবায়ন সম্পর্কে বিশদ বিশ্লেষণ ছাড়া, যা প্রায় অবশ্যই এক্স-ব্রাউজারে পরিবর্তিত হয়, আমরা সংঘর্ষের আসল প্রতিক্রিয়াগুলি জানতে পারি না। সরলতার জন্য আমি এলোমেলোতার একটি আদর্শ উত্স ধরে নিচ্ছি। তবে হ্যাঁ, এটি মাক্সার ইস্যু হাইলাইট হিসাবে একটি বিপজ্জনক ধারণা হতে পারে। নোড- ইউইইডেও ( github.com/broofa/node-uuid ) এ কারণেই আমি অন্যান্য এপিআইগুলিকে পছন্দ করি যা ম্যাথ.আরন্ডম () এর চেয়ে ক্রিপ্টোগ্রাফিক মানের মানের এলোমেলো গ্যারান্টি দেয়, যদিও এর জন্য পারফরম্যান্স ভোগ করে।
ব্রুফা

144
নিশ্চয়ই @ মুক্সার প্রশ্নের উত্তর 'না'? ক্লায়েন্টের কাছ থেকে এসেছে এমন কোনও কিছুকে বিশ্বাস করা সত্যই নিরাপদ নয়। আমি অনুমান করি যে এটি আপনার ব্যবহারকারীরা জাভাস্ক্রিপ্ট কনসোল আনার এবং ম্যানুয়ালি ভেরিয়েবলটি নিজের পছন্দমতো পরিবর্তিত করতে পারে তার উপর নির্ভর করে। অথবা তারা আপনাকে যে আইডি চান তা কেবল আপনাকে পোস্ট করতে পারে। এটির উপর নির্ভর করবে ব্যবহারকারী তাদের নিজস্ব আইডি বাছাই করা দুর্বলতার কারণ হতে চলেছে। যে কোনও উপায়ে, যদি এটি কোনও এলোমেলো নম্বর আইডি থাকে যা কোনও টেবিলের মধ্যে চলে যায় তবে আমি সম্ভবত এটি সার্ভার-সাইড তৈরি করব, যাতে আমি জানি যে প্রক্রিয়াটির উপরে আমার নিয়ন্ত্রণ রয়েছে।
ক্যাম জ্যাকসন

36
@ ড্র্রুনোকস - ইউইউডিগুলি কেবল এলোমেলো # এর স্ট্রিং নয়। "4" হ'ল ইউইড সংস্করণ (4 = "এলোমেলো")। "Y" চিহ্নগুলি যেখানে uuid বৈকল্পিক (ক্ষেত্রের বিন্যাস, মূলত) এম্বেড করা প্রয়োজন। আরও তথ্যের জন্য ietf.org/rfc/rfc4122.txt এর বিভাগ 4.1.1 এবং 4.1.3 দেখুন।
ব্রুফা

5
c== 'x'পরিবর্তে কেন c === 'x'। কারণ জিশিন্ট ব্যর্থ হয়েছে।
ফিজার খান

809

ব্রুফার উত্তরটি কতটা পরিষ্কার তা আমি সত্যিই পছন্দ করি তবে দুর্ভাগ্য যে দুর্বল প্রয়োগগুলিMath.random সংঘর্ষের সুযোগ ছেড়ে দেয়।

এখানে একটি অনুরূপ আরএফসি 4122 সংস্করণ 4 অনুমানযুক্ত সমাধান রয়েছে যা টাইমস্ট্যাম্পের একটি হেক্স অংশ দ্বারা প্রথম 13 হেক্স সংখ্যাগুলি অফসেট করে এবং পেজলোডের পরে মাইক্রোসেকেন্ডগুলির একটি হেক্স অংশ দ্বারা অফসেটগুলি একবারে কমিয়ে দেওয়ার মাধ্যমে সমস্যার সমাধান করে। এই পদ্ধতিতে, এমনকি Math.randomএকই বীজে থাকলেও , উভয় ক্লায়েন্টকেই ইউইউডি তৈরি করতে হবে পেজলোডের পরে (যদি উচ্চ-পারফরম্যান্স সময় সমর্থিত হয়) এবং সঠিক মিলিসেকেন্ডে (বা 10,000+ বছর পরে) ঠিক একই পরিমাণে ইউআইডি তৈরি করতে হবে একই ইউআইডি পাবেন:

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()প্রতি মিলিসেকেন্ডে আপডেট হয় না। আমি নিশ্চিত না কীভাবে এটি আপনার অ্যালগোরিদমের প্রত্যাশিত এলোমেলো প্রভাব ফেলে।
ডিভাইস 1

84
পারফরম্যান্স.নো আরও ভাল হবে। ডেট.নো থেকে ভিন্ন, টাইমস্ট্যাম্পগুলি performance.now()কেবল এক-মিলিসেকেন্ড রেজোলিউশনের মধ্যে সীমাবদ্ধ নয়। পরিবর্তে, তারা মাইক্রোসেকেন্ড যথার্থতার সাথে ভাসমান-পয়েন্ট সংখ্যা হিসাবে সময় উপস্থাপন করে । ডেট.নো থেকে পৃথক, পারফরম্যান্সের মাধ্যমে ফিরে আসা মানগুলি nowNo () সর্বদা একটি স্থির হারে বৃদ্ধি পায় , সিস্টেম ঘড়ির চেয়ে আলাদা যা ম্যানুয়ালি অ্যাডজাস্ট করতে পারে বা নেটওয়ার্ক টাইম প্রোটোকলের মতো সফ্টওয়্যার দ্বারা স্কিউ করা যেতে পারে।
ড্যানিয়েলম্ব

6
@ লাডিয়েলম্ব আপনার সম্ভবত এমডিএন বা অন্য কোনও সাথে লিঙ্ক করা উচিত সত্যিকারের ডকুমেন্টেশন দেখানোর জন্য এবং কোনও পলিফিল নয়;)
মার্টিন

2
আমি কি ব্যবহারের রাউন্ডিংটি জানতে পারি d = Math.floor(d/16);?
প্রবীণ

2
@ প্রবীণ যে অপারেশনটি টাইমস্ট্যাম্পটিকে একটি হেক্স-ডিজিটকে ডানে সরিয়ে দেয় এবং বাকী অংশটি ফেলে দেয়। এর উদ্দেশ্য হ'ল আমরা যে সুনির্দিষ্ট অঙ্কটি ব্যবহার করেছি (তার মধ্যে সর্বনিম্ন তাৎপর্যপূর্ণ) এবং এটি পরের পুনরাবৃত্তির জন্য প্রস্তুত করা।
ব্রিগেয় 37

430

ব্রুফার উত্তরটি বেশ চতুর, প্রকৃতপক্ষে - চিত্তাকর্ষকভাবে চতুর, সত্যই ... rfc4122 অনুগত, কিছুটা পঠনযোগ্য এবং কমপ্যাক্ট। অসাধারণ!

তবে আপনি যদি সেই নিয়মিত অভিব্যক্তিটি দেখছেন, সেই বহু replace()কলব্যাকগুলি toString()এবং Math.random()ফাংশন কলগুলি (যেখানে তিনি কেবল ফলাফলের 4 টি বিট ব্যবহার করছেন এবং বাকী অংশটি নষ্ট করছেন), আপনি অভিনয় সম্পর্কে অবাক হতে শুরু করতে পারেন। প্রকৃতপক্ষে, জেলপেট এমনকি জেনেরিক জিইউডি গতির জন্য আরএফসি টস আউট করার সিদ্ধান্ত নিয়েছে generateQuickGUID

তবে, আমরা কি গতি এবং আরএফসি সম্মতি পেতে পারি ? আমি বলতে হ্যাঁ! আমরা কি পঠনযোগ্যতা বজায় রাখতে পারি? ভাল ... আসলে নয়, তবে আপনি যদি অনুসরণ করে যান তবে এটি সহজ।

তবে প্রথমে আমার ফলাফলগুলি ব্রুফার তুলনায় 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

একটি ব্যাখ্যার জন্য, ব্রুফার কোড দিয়ে শুরু করা যাক:

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সাথে, এলোমেলো উপাত্তের সাথে প্রতিস্থাপন করে (শীর্ষে দুটি বিটকে 10আরএফসি স্পেস অনুসারে জোর করা ব্যতীত ), এবং রেজেক্সটি অক্ষর -বা 4চরিত্রগুলির সাথে মেলে না , তাই তাকে মোকাবেলা করতে হবে না। খুব, খুব চতুর।

প্রথমটি জানতে হবে যে ফাংশন কলগুলি ব্যয়বহুল, যেমনটি নিয়মিত এক্সপ্রেশন হয় (যদিও তিনি কেবল 1 ব্যবহার করেন, এটিতে 32 টি কলব্যাক রয়েছে, প্রতিটি ম্যাচের জন্য একটি করে, এবং 32 টি কলব্যাকের প্রত্যেকটিতে এটি ম্যাথ.র্যান্ডম () এবং ভি কল করে। toString (16))।

পারফরম্যান্সের দিকে প্রথম পদক্ষেপটি হ'ল RegEx এবং এর কলব্যাক ফাংশনগুলি মুছে ফেলা এবং পরিবর্তে একটি সাধারণ লুপ ব্যবহার করা। এর অর্থ আমাদের ব্রোফা যেখানে করেনি সেখানে -এবং 4চরিত্রগুলি নিয়ে কাজ করতে হবে। এছাড়াও, নোট করুন যে আমরা তার স্ট্রিং স্ট্রিং টেম্পলেট আর্কিটেকচারটি রাখতে স্ট্রিং অ্যারে সূচক ব্যবহার করতে পারি:

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()কলব্যাকের পরিবর্তে ) আমাদের প্রায় 3 এক্স উন্নতি দেয়!

পরবর্তী পদক্ষেপটি ডেস্কটপে ছোট একটি তবে মোবাইলে একটি শালীন পার্থক্য তৈরি করে। আসুন কম ম্যাথ.আরন্ডম () কল করি এবং সেই সমস্ত র্যান্ডম বিটগুলি ব্যবহার করে এর মধ্যে ৮ 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-বিট প্রক্রিয়া করি। এটি তাত্ক্ষণিক যেহেতু আমাদের এখনও আরএফসি অনুগত বিট অবস্থানগুলি পরিচালনা করতে হবে তবে এটি খুব বেশি কঠিন নয়। তারপরে 0x00 - 0xff সঞ্চয় করতে আমাদের একটি বৃহত্তর সন্ধানের টেবিল তৈরি করতে হবে (16x16, বা 256) এবং আমরা ই 5 () ফাংশনের বাইরে কেবল একবার এটি তৈরি করব।

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

আমি একটি E6 () চেষ্টা করেছি যা একবারে 16-বিট প্রসেস করে, এখনও 256-উপাদান LUT ব্যবহার করে এবং এটি অপ্টিমাইজেশনের হ্রাসকারী রিটার্ন দেখায়। যদিও এটির পুনরাবৃত্তি কম ছিল, অভ্যন্তরীণ যুক্তি বর্ধিত প্রক্রিয়াজাতকরণ দ্বারা জটিল হয়েছিল এবং এটি ডেস্কটপে এটি সম্পাদন করেছিল এবং মোবাইলে মাত্র 10% দ্রুত faster

চূড়ান্ত অপ্টিমাইজেশন কৌশল প্রয়োগ করতে - লুপটি আনরোল করুন। যেহেতু আমরা একটি নির্দিষ্ট সংখ্যক বার লুপ করছি, আমরা প্রযুক্তিগতভাবে এগুলি হাতে হাতে লিখে রাখতে পারি। আমি একবারে চেষ্টা করেছি এমন একক র্যান্ডম ভেরিয়েবল আর দিয়ে যা আমি পুনরায় বরাদ্দ রেখেছি, এবং পারফরম্যান্সটি ট্যাঙ্ক করেছি। তবে সামনে চারটি ভেরিয়েবল নির্ধারিত এলোমেলো ডেটা, তারপরে অনুসন্ধান সারণীটি ব্যবহার করে এবং যথাযথ আরএফসি বিট প্রয়োগ করার সাথে, এই সংস্করণটি তাদের সমস্ত ধূমপান করে:

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 বাইট জেনারেট করা সহজ অংশ। পুরো কৌশলটি এটি আরএফসি সম্মতিতে স্ট্রিং ফর্ম্যাটে প্রকাশ করছে এবং এটি 16 টি বাইটের এলোমেলো ডেটা, একটি অনিবন্ধিত লুপ এবং অনুসন্ধান সারণী দিয়ে সর্বাধিক দৃ .়তার সাথে সম্পন্ন হয়েছে।

আমি আশা করি আমার যুক্তিটি সঠিক - এই জাতীয় ক্লান্তিকর বিট-কর্মে ভুল করা খুব সহজ। তবে ফলাফলগুলি আমার কাছে ভাল দেখাচ্ছে। আমি আশা করি আপনি কোড অপ্টিমাইজেশনের মাধ্যমে এই উন্মাদ যাত্রাটি উপভোগ করেছেন!

পরামর্শ দিন: আমার প্রাথমিক লক্ষ্যটি সম্ভাব্য অপ্টিমাইজেশান কৌশলগুলি দেখানো এবং শেখানো ছিল। অন্যান্য উত্তরগুলি সংঘর্ষ এবং সত্যই এলোমেলো সংখ্যার মতো গুরুত্বপূর্ণ বিষয়গুলি কভার করে, যা ভাল ইউআইডিগুলি তৈরির জন্য গুরুত্বপূর্ণ।


14
এই কোডটিতে এখনও বেশ কয়েকটি ত্রুটি রয়েছে: Math.random()*0xFFFFFFFFলাইনগুলি Math.random()*0x100000000সম্পূর্ণ এলোমেলো হওয়ার জন্য >>>0হওয়া উচিত |0এবং মানগুলি স্বাক্ষরিত না করে পরিবর্তে ব্যবহার করা উচিত (যদিও বর্তমান কোডের সাথে আমি মনে করি যে তারা স্বাক্ষরিত হলেও এটি ঠিক হয়ে গেছে)। অবশেষে এটি window.crypto.getRandomValuesউপলব্ধ থাকলে এটি ব্যবহার করা খুব ভাল ধারণা হবে এবং যদি একেবারে প্রয়োজন হয় তবে ম্যাথ.র্যান্ডম-এ ফিরে যান। ম্যাথ.র্যান্ডমের এনট্রপি-র 128 বিট কম থাকতে পারে, সেক্ষেত্রে এটি প্রয়োজনের তুলনায় সংঘর্ষের পক্ষে আরও ঝুঁকির হতে পারে।
ডেভ

ইতিমধ্যে এই থ্রেডে থাকা সমস্ত কিছুর উপর ভিত্তি করে, আমি "e7" হিসাবে দ্বিগুণ দ্রুত কিছু তৈরি করেছি, নোড সহ সমস্ত পরিবেশ বহনযোগ্য, এবং ম্যাথ.রান্ডম () থেকে ক্রিপ্টো-শক্তি শক্তিহীনতায় আপগ্রেড করেছি। আপনি হয়ত ভাববেন না যে ইউইডির ক্রিপ্টো শক্তি প্রয়োজন, তবে এর অর্থ সংঘর্ষের সম্ভাবনাও কম, যা ইউইডির পুরো বিন্দু। একটি মন্তব্যে ফিট করার জন্য খুব বড়, আমি এটি আলাদাভাবে পোস্ট করেছি।
বেনেট বারৈচ

163

এখানে আরএফসি 4122 , বিভাগ 4.4 (সত্যই র্যান্ডম বা সিউডো-র্যান্ডম নম্বর থেকে একটি ইউইউডি তৈরির জন্য অ্যালগরিদম) এর ভিত্তিতে কিছু কোড রয়েছে ।

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
আপনি জিইডিউটি ​​তৈরি করার সাথে সাথে অ্যারের আকারটিকে গতিময় আকার দেওয়ার চেয়ে আগেই ঘোষণা করা উচিত। var s = new Array(36);
MgSam

1
আমি মনে করি যে রেখার মধ্যে খুব ছোট একটি বাগ আছে যা ঘড়ির_সেক_হ_আর_আর_আর 01-তে সংরক্ষিত বিট বিটস সেট করে 19 [19] এবং 0x3) | 0x8 এলোমেলোভাবে বিতরণ করা হবে না - এটি আরও বেশি '9 এবং কম' বি তৈরি করতে পারে tend আপনি যদি কোনও কারণে এলোমেলো বিতরণ সম্পর্কে চিন্তা করেন তবে এটি কেবলমাত্র একটি পার্থক্য রাখে।
জন ভেলোনিস

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

যদি আইডিগুলি 1 মিলিসেকেন্ডের বেশি আলাদাভাবে উত্পন্ন হয় তবে সেগুলি 100% অনন্য।

যদি দুটি আইডি সংক্ষিপ্ত বিরতিতে উত্পন্ন হয় এবং ধরে নেওয়া যায় যে এলোমেলো পদ্ধতিটি সত্যই এলোমেলো, এটি আইডি তৈরি করবে যা বিশ্বব্যাপী অনন্য হওয়ার সম্ভাবনা রয়েছে 99.9999999999999999% (10 ^ 15 এর মধ্যে সংঘর্ষ)

আপনি আরও সংখ্যা যুক্ত করে এই সংখ্যাটি বাড়িয়ে তুলতে পারেন, তবে 100% অনন্য আইডি তৈরি করতে আপনার একটি বৈশ্বিক কাউন্টার ব্যবহার করতে হবে।

আপনার যদি আরএফসি সামঞ্জস্যতার প্রয়োজন হয় তবে এই ফর্ম্যাটটি একটি বৈধ সংস্করণ 4 জিইউইডি হিসাবে পাস করবে:

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

সম্পাদনা করুন: উপরের কোডটি উদ্দেশ্যটি অনুসরণ করে তবে আরএফসির চিঠিটি নয়। অন্যান্য ভিন্নতার মধ্যে এটি কয়েকটি এলোমেলো সংখ্যা সংক্ষিপ্ত। (আপনার যদি প্রয়োজন হয় তবে আরও এলোমেলো সংখ্যার যোগ করুন) উলটো দিকটি এটি সত্যিই দ্রুত :) আপনি আপনার জিইউডিটির বৈধতা এখানে পরীক্ষা করতে পারেন


4
এটি যদিও ইউইউডি না?
মার্কো কেরউইটজ ২

নং ইউআইইউডি / জিইউডি এর একটি 122 বিট (ছয়টি সংরক্ষিত বিট) নম্বর। এটি বিশ্বব্যাপী কাউন্টার পরিষেবার মাধ্যমে স্বতন্ত্রতার গ্যারান্টি দিতে পারে তবে প্রায়ই এটি সময়মতো, ম্যাকের ঠিকানা এবং এলোমেলোভাবে সম্পর্কিত হয়। ইউআইডি গুলো এলোমেলো নয়! আমি এখানে প্রস্তাবিত ইউআইডি পুরোপুরি সংকুচিত নয়। আপনি এটি সংক্ষেপে, একটি 122 বিট পূর্ণসংখ্যায়, 6 পূর্বনির্ধারিত বিট এবং অতিরিক্ত এলোমেলো বিট যুক্ত করতে পারেন (কয়েকটি টাইমার বিট অপসারণ করুন) এবং আপনি একটি নিখুঁতভাবে গঠিত ইউআইডি / জিইউডি দিয়ে শেষ করতে পারেন যে আপনাকে তখন হেক্সে রূপান্তর করতে হবে। আমার কাছে যা আইডির দৈর্ঘ্যের সাথে সম্মতি ছাড়া অন্য কিছু যুক্ত করে না।
সাইমন রিগেট

5
ভার্চুয়াল মেশিনে স্বতন্ত্রতার জন্য ম্যাক অ্যাড্রেসগুলিতে রিলেট করা একটি খারাপ ধারণা!
সাইমন রিগেট

1
আমি এটির মতো কিছু করি, তবে শীর্ষস্থানীয় চরিত্রগুলি এবং কিছু ড্যাশ সহ (যেমন [slug, date, random].join("_")তৈরি করা usr_1dcn27itd_hj6onj6phrIt এটি এটিকে তৈরি করে যাতে আইডিটি "
ক্রিয়েট

95

বিন্যাসে স্ট্রিং জেনারেটর পদ্ধতির মতো দ্রুততম জিইউডি XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX। এটি স্ট্যান্ডার্ড-কমপ্লায়েন্ট জিইউডি উত্পন্ন করে না।

এই বাস্তবায়নের দশ মিলিয়ন মৃত্যুদন্ড কার্যকর হবে মাত্র 32.5 সেকেন্ড, যা আমি এখন পর্যন্ত দ্রুততম কোনও ব্রাউজারে দেখেছি (লুপ / ​​পুনরাবৃত্তি ছাড়া একমাত্র সমাধান)।

ফাংশনটি হিসাবে সহজ:

/**
 * Generates a GUID string.
 * @returns {string} The generated GUID.
 * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
 * @author Slavik Meltser.
 * @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") নয়টি জিরো যুক্ত করার দরকার ছিল এবং তারপরে আটটি অক্ষরের দৈর্ঘ্য সহ দ্বিতীয় সূচক (তৃতীয় অক্ষর) থেকে এটি কেটে ফেলা উচিত। বাকি ক্ষেত্রে, শূন্যগুলি যুক্ত করা ফলাফলটির ক্ষতি করবে না কারণ এটি যেভাবেই এটি কেটে ফেলছে।
    Math.random().toString(16)+"000000000").substr(2,8)

সমাবেশ:

  • জিইউডিটি নিম্নলিখিত ফর্ম্যাটে রয়েছে XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  • আমি জিইউডিকে 4 টি টুকরো করে বিভক্ত করেছি, প্রতিটি টুকরা 2 প্রকারে (বা বিন্যাসে) বিভক্ত: XXXXXXXXএবং -XXXX-XXXX
  • এখন আমি কল 4 টুকরা সঙ্গে GUID জড় করা এই 2 ধরনের ব্যবহার GUID নির্মাণ করছি, যেমন অনুসরণ করে: XXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX
  • এই দুটি প্রকারের মধ্যে পার্থক্য রাখতে, আমি একটি জুটির নির্মাতার কার্যক্রমে একটি পতাকা পরামিতি যুক্ত করেছি _p8(s), sপ্যারামিটারটি ড্যাশ যুক্ত করতে হবে কিনা তা ফাংশনটি বলে।
  • অবশেষে আমরা নিম্নলিখিত শিকল দিয়ে জিইউইডিটি তৈরি করি: _p8() + _p8(true) + _p8(true) + _p8()এবং এটি ফিরিয়ে দিন।

আমার ব্লগে এই পোস্টে লিঙ্ক

উপভোগ করুন! :-)


13
এই প্রয়োগটি ভুল। জিইউইডি-র কিছু নির্দিষ্ট অক্ষরের জন্য বিশেষ চিকিত্সা প্রয়োজন (উদাহরণস্বরূপ 13 তম সংখ্যাটি 4 নম্বর হওয়া দরকার)।
JLRishe

67

এখানে ক্রোমের সংঘর্ষগুলির জন্য কার্যকর মতামত সহ শীর্ষে ভোট দেওয়া উত্তরের একটি সংমিশ্রণ রয়েছে :

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

জেসবিনে যদি আপনি এটি পরীক্ষা করতে চান।


3
নোট যে প্রথম সংস্করণ, একটি `window.crypto.getRandomValues , does not keep the Version 4 UUIDs format defined by RFC 4122. That is instead of XXXXXXXX-XXXX-4xxx-yxxx-xxxxxxxxxxxx` এটা উৎপাদ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
humanityANDpeace

66

এএসসিআইআই-নিরাপদ জিইউইডি -র মতো অনন্য শনাক্তকারী জেনারেট করার জন্য এটি সম্পূর্ণরূপে অ-অনুগত তবে খুব পারফরম্যান্ট বাস্তবায়ন।

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

26 টি [a-z0-9] টি অক্ষর উত্পন্ন করে, এমন একটি ইউআইডি দেয় যা উভয়ই আরএফসি অনুবর্তী জিইউইডিগুলির চেয়ে খাটো এবং আরও অনন্য। মানব-পঠনযোগ্যতার বিষয়টি বিবেচনায় রাখলে ড্যাশগুলি তুচ্ছভাবে যুক্ত করা যায়।

এই ফাংশনটির জন্য ব্যবহারের উদাহরণ এবং সময় এবং এই প্রশ্নের বিভিন্ন উত্তর রয়েছে। সময়টি ক্রোম এম 25 এর অধীনে করা হয়েছিল, প্রতিটিতে 10 মিলিয়ন পুনরাবৃত্তি।

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

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

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

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

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

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

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

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

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

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

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

এখানে টাইমিং কোড দেওয়া আছে।

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

62

এখানে ব্যবহারকারীর একটি মন্তব্য থেকে একটি সমাধান তারিখের অক্টোবর 9, 2011 এর জেডhttps://gist.github.com/982883 :

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

এটি বর্তমান সর্বোচ্চ-রেট করা উত্তরের মতো একই লক্ষ্য অর্জন করেছে , কিন্তু 50++ কম বাইটে জবরদস্তি, পুনরাবৃত্তি এবং ক্ষতিকারক স্বরলিপি ব্যবহার করে। এটি কীভাবে আগ্রহী তাদের আগ্রহীদের জন্য, এখানে ফাংশনটির পুরানো সংস্করণটির টীকাকরণ ফর্মটি দেওয়া হয়েছে:

UUIDv4 =

function b(
  a // placeholder
){
  return a // if the placeholder was passed, return
    ? ( // a random number from 0 to 15
      a ^ // unless b is 8,
      Math.random() // in which case
      * 16 // a random number from
      >> a/4 // 8 to 11
      ).toString(16) // in hexadecimal
    : ( // or otherwise a concatenated string:
      [1e7] + // 10000000 +
      -1e3 + // -1000 +
      -4e3 + // -4000 +
      -8e3 + // -80000000 +
      -1e11 // -100000000000,
      ).replace( // replacing
        /[018]/g, // zeroes, ones, and eights with
        b // random hex digits
      )
}

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

অ্যাক্টিভএক্স নিয়ন্ত্রণ ব্যবহার করে জড়িত এমন অন্যান্য পদ্ধতি রয়েছে তবে এগুলি থেকে দূরে থাকুন!

সম্পাদনা: আমি ভেবেছিলাম এটি দেখানো উপযুক্ত যে কোনও জিইউইডি জেনারেটর অনন্য কীগুলির গ্যারান্টি দিতে পারে না ( উইকিপিডিয়া নিবন্ধটি পরীক্ষা করুন )। সবসময় সংঘর্ষের সুযোগ থাকে। একটি জিইউইডি সহজেই সংঘর্ষের পরিবর্তনগুলি প্রায় শূন্যের দিকে হ্রাস করার জন্য একটি বৃহত পর্যাপ্ত মহাবিশ্বের কী সরবরাহ করে।


8
নোট করুন যে এটি প্রযুক্তিগত দিক থেকে কোনও G নির্দেশ নয়, কারণ এটি স্বতন্ত্রতার গ্যারান্টি দেওয়ার জন্য কিছুই করে না। আপনার অ্যাপ্লিকেশন উপর নির্ভর করে এটি হতে পারে বা নাও পারে।
স্টিফেন ডেকেন

2
কর্মক্ষমতা সম্পর্কে একটি দ্রুত নোট। এই সমাধানটি একক ফলাফল পেতে মোট 36 টি স্ট্রিং তৈরি করে। তাহলে কর্মক্ষমতা গুরুত্বপূর্ণ, একটি বিন্যাস তৈরি করা এবং যোগদান বিবেচনা হিসাবে সুপারিশ: tinyurl.com/y37xtx আরও গবেষণা ইঙ্গিত এটা কোন ব্যাপার না পারে, তাই YMMV: tinyurl.com/3l7945
ব্রান্ডন Durette

2
স্বতন্ত্রতা সম্পর্কে, এটি যে সংস্করণ 1,3, এবং 5 টি ইউইউডিগুলি সংস্করণ 4 নয়, সেগুলি নির্ধারণকারী not যদি এই ইউইডি জেনারেটরের ইনপুটগুলি - ভি 1-র নোড আইডি, নাম স্পেস এবং ভি 3 এবং ভি 5 এর নাম - তবে অনন্য (তবে তারা যেমন অনুমিত হয়), তবে ফলাফল প্রাপ্ত ইউআইডিগুলি অনন্য হয়ে যায়। তত্ত্বত্বে, যাইহোক।
ব্রুফা

41

আপনি নোড-ইউইড ব্যবহার করতে পারেন ( https://github.com/kelektiv/node-uuid )

আরএফসি 4122 ইউআইডিএস-এর সহজ, দ্রুত প্রজন্ম ।

বৈশিষ্ট্য:

  • আরএফসি 4122 সংস্করণ 1 বা সংস্করণ 4 ইউআইডি উত্পন্ন করুন
  • নোড.জে এবং ব্রাউজারগুলিতে চলছে।
  • সমর্থনকারী প্ল্যাটফর্মগুলিতে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী র্যান্ডম # প্রজন্ম।
  • ছোট পদচিহ্ন (আরও কিছু চান? এটি দেখুন! )

এনপিএম ব্যবহার করে ইনস্টল করুন:

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 / মাস্টার / 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);
    });
};

সম্পাদনা করুন:

আমার এই প্রকল্পটি পুনরায় দেখা গেছে যা এই ফাংশনটি ব্যবহার করে এবং শব্দটির অপছন্দ করে। - তবে সঠিক এলোমেলো দরকার needed

বাফার থেকে নিবল আকারের উইন্ডোজগুলি বের করার জন্য ব্রিগুই 37 এর উত্তরের উপর ভিত্তি করে একটি সংস্করণ এবং কিছু বিটওয়াইস অপারেটর।

আরএফসি টাইপ 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- এর মধ্যে বাইনারি উপস্থাপনা ব্যবহার করা উচিতGUIDstringUint16ArraytoStringobject
সেবাস্টিয়ান

এই কোড দ্বারা উত্পাদিত এই ইউআইডিগুলি হয় দুর্বল-তবে-আরএফসি-কমপ্লায়েন্ট (_ গুইড), বা শক্তিশালী-তবে-নয়-আরএফসি-অনুবর্তী (_ক্রিপ্টোগুইড)। পূর্ববর্তী ম্যাথ.র্যান্ডম () ব্যবহার করে, যা এখন একটি দরিদ্র আরএনজি হিসাবে পরিচিত। পরেরটি সংস্করণ এবং বৈকল্পিক ক্ষেত্রগুলি সেট করতে ব্যর্থ হচ্ছে।
ব্রুফা

@ ব্রোফা - এটিকে শক্তিশালী এবং আরএফসি-অনুগত করার জন্য আপনি কী পরামর্শ দেবেন ? এবং _ক্রিপ্টোগুইড আরএফসি-অনুগত নয় কেন?
ম্যাট

@ ম্যাট _ক্রিপ্টোগুইড () সমস্ত 128 বিট এলোমেলোভাবে সেট করে, যার অর্থ এটি আরএফসিতে বর্ণিত সংস্করণ এবং বৈকল্পিক ক্ষেত্রগুলি সেট করে না। শক্তিশালী + অনুবর্তী বাস্তবায়নের জন্য উপরের, আমার শীর্ষ-ভোট দেওয়া উত্তরে, crypto.getRandomValues ​​() ব্যবহার করে uuidv4 () এর আমার বিকল্প বাস্তবায়ন দেখুন।
ব্রুফা

29

এটি সংস্করণ 4 ইউআইডি তৈরি করে (সিউডো এলোমেলো সংখ্যা থেকে তৈরি):

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

উত্পন্ন ইউইউডিগুলির একটি নমুনা এখানে:

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

গীটহাবের জাভাস্ক্রিপ্ট প্রকল্প - https://github.com/LiosK/UUID.js

ইউআইউডি.জেএস জাভাস্ক্রিপ্টের জন্য আরএফসি-সম্মতিযুক্ত ইউআইডি জেনারেটর।

আরএফসি 4122 http://www.ietf.org/rfc/rfc4122.txt দেখুন

বৈশিষ্ট্যগুলি আরএফসি 4122 অনুপযুক্ত ইউআইডিগুলি উত্পন্ন করে।

সংস্করণ 4 ইউআইডি (র্যান্ডম সংখ্যাগুলি থেকে ইউআইডি) এবং সংস্করণ 1 ইউআইডি (সময় ভিত্তিক ইউআইডি) উপলব্ধ।

ইউইউডি অবজেক্ট ইউইউডি ক্ষেত্রগুলিতে অ্যাক্সেস সহ ইউইউডিতে বিভিন্ন অ্যাক্সেসের অনুমতি দেয়।

জাভাস্ক্রিপ্টের লো টাইমস্ট্যাম্প রেজোলিউশন এলোমেলো সংখ্যা দ্বারা ক্ষতিপূরণ হয়।


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

গতির বিবেচনার সাথে একটি আরএফসি 4122 সংস্করণ 4 সম্মতিজনক সমাধান চান তাদের জন্য (ম্যাথ.র্যান্ডম () এর কাছে কয়েকটি কল):

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

উপরের ফাংশনটির গতি এবং এলোমেলোতার মধ্যে একটি শালীন ভারসাম্য থাকা উচিত।



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}

11

আমি জানি, এটি একটি পুরানো প্রশ্ন। কেবল সম্পূর্ণতার জন্য, যদি আপনার পরিবেশটি শেয়ারপয়েন্ট হয় তবে একটি ইউটিলিটি ফাংশন রয়েছে SP.Guid.newGuid( এমএসডিএন লিঙ্ক ) যা একটি নতুন গাইড তৈরি করে। এই ফাংশনটি 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 সনাক্তকারীদের জন্য ভাল কাজ করে। এটি সর্বদা এমন কিছু ফেরত দেয় যা হ্যাক করা সহজ:

ইউআইডি-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

সমর্থিত ব্রাউজারগুলিতে (আই 11 +, আইওএস 7 +, এফএফ 21 +, ক্রোম, অ্যান্ড্রয়েড ক্রোম) ব্যবহার crypto.getRandomValues(a)করে এমন সহজ কোড । ব্যবহার এড়াতে কারণ যে দুর্ঘটনায় (উদাহরণস্বরূপ 4000 উত্পন্ন UUID জানা জন্য 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 হিসাবে অনুমোদিত) simp

11

আপনার যদি কোনও নির্দিষ্ট বিন্যাসে কেবল এলোমেলো 128 বিট স্ট্রিং দরকার হয় তবে আপনি ব্যবহার করতে পারেন:

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

যা কিছু ফিরে আসবে 2350143528-4164020887-938913176-2513998651


বিটিডাব্লু, কেন এটি কেবল সংখ্যাগুলি তৈরি করে না পাশাপাশি অক্ষরগুলিও তৈরি করে না? অনেক কম সুরক্ষিত
vsync

1
আপনি এর মতো অক্ষর (অক্ষর) যুক্ত করতে পারেন:Array.from((window.crypto || window.msCrypto).getRandomValues(new Uint32Array(4))).map(n => n.toString(16)).join('-')
ম্যাজিকমেকার

10

মাত্র দুটি মিউটেশন সহ আরও আরও পঠনযোগ্য বৈকল্পিক।

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

@ inf3rno তাকে ঘৃণা করবেন না, এই থ্রেডে প্রস্তাবিত সমস্ত সমাধান রহস্যজনক তবে প্রশ্নটি বিবেচনা করে তারা সঠিক উত্তর দিচ্ছেন এক ধরণের ওয়ান-লাইনার থাকা উচিত। ওয়ান-লাইনারগুলি ক্রিপ্টিক। তারা গড় বিকাশকারীকে পঠনযোগ্য করে তোলার সামর্থ্য রাখে না তবে তারা স্ক্রিন রিয়েল এস্টেট সংরক্ষণ করে যেখানে একটি সাধারণ পূর্ববর্তী মন্তব্য করবে। এবং ফলস্বরূপ, যদি সেটির পরিবর্তে "পাঠযোগ্য কোড" এ থাকত তবে সেভাবে আরও বেশি পঠনযোগ্য হয়ে যায়।
তাতসু

এলোমেলো! = অনন্য
ব্যবহারকারী 1529413

@ ব্যবহারকারী 1529413 হ্যাঁ। স্বতন্ত্রতার জন্য একটি সূচক প্রয়োজন।
সিলিং

8

ঠিক আছে, uuid প্যাকেজটি ব্যবহার করে , এটি সংস্করণ 1, 3, 4 এবং 5 ইউআইডিগুলি সমর্থন করে:

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'

আরও তথ্যের জন্য, এখানে এনপিএম পৃষ্ঠা দেখুন


6

এটির জন্য আপনার নিজের জিনিসগুলি চাবুকের পরিবর্তে 1 টিরও বেশি অবদানকারী দ্বারা রক্ষণ করা ভাল পরীক্ষিত কোড ব্যবহার করা গুরুত্বপূর্ণ important এটি এমন এক স্থান যেখানে আপনি সম্ভবত এক্স ব্রাউজারে কাজ করে তবে সংক্ষিপ্ততম চতুর সংস্করণের চেয়ে সবচেয়ে স্থিতিশীল কোডটি পছন্দ করতে চান তবে ওয়াইয়ের আইডিয়াসিন্যাসিকে অ্যাকাউন্টে গ্রহণ করবেন না যা প্রায়শই এলোমেলোভাবে প্রকাশের চেয়ে বাগগুলি তদন্ত করতে খুব কঠিন হতে পারে কিছু ব্যবহারকারীর জন্য। ব্যক্তিগতভাবে আমি https://github.com/aurigadl/uuid-js এ ইউউইড-জেএস ব্যবহার করি যা কোন শক্তিশালী সক্ষম তাই আমি আপডেটগুলি সহজেই নিতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.