জাভাস্ক্রিপ্টে ইউআইডিগুলি তৈরি করার সময় সংঘর্ষ?


94

এটি এই প্রশ্নের সাথে সম্পর্কিত । আমি জাভাস্ক্রিপ্টে ইউআইডি উত্পন্ন করতে এই উত্তর থেকে নীচের কোডটি ব্যবহার করছি :

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

এই সমাধানটি ঠিকঠাকভাবে কাজ করেছে বলে মনে হয়েছে, তবে আমি সংঘাত পেয়ে যাচ্ছি। আমার যা আছে তা এখানে:

  • গুগল ক্রোমে একটি ওয়েব-অ্যাপ চলছে
  • 16 জন ব্যবহারকারী।
  • এই ব্যবহারকারীরা গত 2 মাসে প্রায় 4000 ইউইউডি তৈরি করেছে।
  • আমি প্রায় 20 টি সংঘর্ষ পেয়েছি - যেমন আজ নতুন উত্সাহিত ইউইউডি প্রায় 2 মাস আগে (ভিন্ন ব্যবহারকারী) এর সমান।

কী কারণে এই সমস্যা সৃষ্টি হচ্ছে এবং আমি কীভাবে এড়াতে পারি?


4
বর্তমান সময়ের সাথে (মিলিসেকেন্ডে) একটি ভাল এলোমেলো সংখ্যা সংযুক্ত করুন। ঠিক একই সময়ে সংঘর্ষিত এলোমেলো সংখ্যার প্রতিক্রিয়াগুলি সত্যই, সত্যই, সত্যই কম।
jਫਰ00

7
@ jfriend00 যদি আপনার এটি করার প্রয়োজন হয় তবে এটি একটি "ভাল র্যান্ডম সংখ্যা" নয়, এমনকি শালীন সিউডো-র্যান্ডম নম্বরও নয়।
আটটিলা ও।

4
কি (r&0x3|0x8)করতে অংশ গড় / মূল্যায়ন করে?
ক্রিশ্চিয়ান

এতে একটি ডেট.নো ()। টু স্ট্রিং () যুক্ত করার বিষয়ে কী?
ভিটিম.ইস

4
আপনার আর্কিটেকচারে একটি বড় সমস্যা রয়েছে, ইউআইডি-র সাথে সম্পর্কিত নয় - ক্লায়েন্ট ইচ্ছাকৃতভাবে সংঘর্ষের আইডি তৈরি করতে পারে। আপনার নির্ভরযোগ্য সিস্টেমের মাধ্যমে আইডি তৈরি করুন Gene যদিও কাজের ভিত্তিতে ক্লায়েন্ট-উত্পাদিত আইডিগুলি ইউজার_আইডি দিয়ে প্রেন্ডেন্ড করুন, যাতে প্রতিপক্ষ / ত্রুটিযুক্ত ক্লায়েন্ট কেবল নিজের সাথে সংঘর্ষ করতে পারে (এবং এটি সার্ভারের পাশ দিয়ে পরিচালনা করতে পারে)।
ডিজিট্রি লেজারকা

উত্তর:


35

আমার সেরা অনুমানটি হ'ল Math.random()কোনও কারণে আপনার সিস্টেমে এটি ভেঙে গেছে (মনে হচ্ছে উদ্ভট)। কারও সংঘর্ষের ঘটনা ঘটতে দেখেছি এটিই আমি প্রথম প্রতিবেদন।

node-uuidএকটি পরীক্ষার জোতা রয়েছে যা আপনি সেই কোডটিতে হেক্স ডিজিটের বিতরণ পরীক্ষা করতে ব্যবহার করতে পারেন। যদি এটি দেখতে ঠিক আছে তবে তা তা নয় Math.random(), সুতরাং আপনি সেই uuid()পদ্ধতিটিতে যে ইউআইডি প্রয়োগ ব্যবহার করছেন সেটি প্রতিস্থাপনের চেষ্টা করুন এবং দেখুন যে আপনি এখনও ভাল ফলাফল পাচ্ছেন কিনা।

[আপডেট: প্রারম্ভের সময় বাগটি সম্পর্কে সবেমাত্র ভেসেলিনের প্রতিবেদনটি দেখেছি Math.random()। যেহেতু সমস্যাটি কেবলমাত্র শুরুতে থাকে তাই node-uuidপরীক্ষাটি কার্যকর হওয়ার সম্ভাবনা কম is আমি devoluk.com লিঙ্কে আরও বিশদে মন্তব্য করব]]


4
ধন্যবাদ, আমি এখন uuid.js নিয়ে যাচ্ছি, যেহেতু এটি উপলব্ধ থাকলে ব্রাউজারের শক্তিশালী ক্রিপ্টো ব্যবহার করে। কোনও সংঘর্ষ রয়েছে কিনা তা দেখবেন।
Muxa

আপনি যে uuid.js কোডটি উল্লেখ করছেন তাতে কোনও লিঙ্ক সরবরাহ করতে পারেন? (দুঃখিত, আপনি কোন
লাইব

10
এখনও পর্যন্ত কোনও সংঘর্ষ ছিল না :)
Muxa

যাইহোক, যদি এটি ক্রোম হয় এবং কেবলমাত্র শুরু করার পরে, আপনার অ্যাপ্লিকেশন উপরের ফাংশনটি ব্যবহার করে একটি দশ সারি তৈরি করে এবং ফেলে দিতে পারে :)
ভিঙ্কো ভার্সালোভিচ

সমস্যাটি আপনি ম্যাথ.র্যান্ডম () থেকে প্রাপ্ত সীমিত এনট্রপি নিয়ে। কিছু ব্রাউজারের জন্য এন্ট্রপি সমস্ত একসাথে মাত্র 41 বিট হিসাবে কম। একাধিকবার ম্যাথ.আরন্ডম () কল করা এন্ট্রপি বাড়িয়ে তুলবে না। আপনি যদি সত্যিই অনন্য ভি 4 ইউআইডি চান তবে আপনার কোনও ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী আরএনজি ব্যবহার করতে হবে যা প্রতি ইউইউডি প্রতি কমপক্ষে 122 বিট এনট্রপি তৈরি করে।
mlehmk

36

প্রকৃতপক্ষে সংঘর্ষ রয়েছে তবে কেবল গুগল ক্রোমের অধীনে। বিষয়টিতে আমার অভিজ্ঞতাটি এখানে দেখুন

http://devoluk.com/google-chrome-math-random-issue.html

(লিংক 2019. সংরক্ষাণাগার লিংক হিসাবে ভাঙ্গা: https://web.archive.org/web/20190121220947/http://devoluk.com/google-chrome-math-random-issue.html ।)

মনে হচ্ছে সংঘর্ষগুলি কেবল ম্যাথ.র্যান্ডমের প্রথম কয়েকটি কলগুলিতে ঘটে। আপনি যদি উপরের ক্রিয়েটগিউআইডি / টেস্টজিইউডস পদ্ধতিটি চালান তবে কারণ (যা আমি প্রথমে চেষ্টা করেছিলাম) এটি যে কোনও সংঘর্ষের সাথে কাজ করে না।

সুতরাং একটি সম্পূর্ণ পরীক্ষা করার জন্য একজনকে গুগল ক্রোম পুনরায় চালু করা, 32 বাইট জেনারেট করা, ক্রোম পুনরায় চালু করা, উত্পন্ন করা, পুনরায় চালু করা, উত্পন্ন করা প্রয়োজন ...


4
এটি বেশ উদ্বেগজনক - কেউ কি কোনও বাগ রিপোর্ট উত্থাপন করেছে?
আপক্রিক

4
বিশেষত জাভাস্ক্রিপ্টে আরও ভাল এলোমেলো সংখ্যা জেনারেটরের লিঙ্কটি পছন্দ করুন: baagoe.com/en/RandomMusings/
লিওপড

দুঃখিতভাবে, বলেন লিঙ্ক এখন নষ্ট হয়ে গেছে :(
গাস


7
এই বাগটি সম্বোধন করা হয়েছে কি কেউ নিশ্চিত করতে পারবেন?
এক্সড্রোন

21

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

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

মাত্র একটি এফওয়াইআই


4
আমাদের মেট্রিক্স সিস্টেমের সাথে একই ইস্যুতে ছড়িয়ে পড়ে। ব্রাউজারে সেশন আইডি তৈরি করতে 'নোড-ইউইইডি' মডিউলটি ব্যবহার করে কয়েক হাজার ইউআইডি সংঘর্ষ দেখছিল। দেখা যাচ্ছে এটি গুগলবোট ছিল along ধন্যবাদ!
domkck

4

আমি আপনার প্রশ্নের একটি মন্তব্য হিসাবে এটি পোস্ট করতে চেয়েছিলেন, কিন্তু স্পষ্টতই স্ট্যাকওভারফ্লো আমাকে দেয় না।

আপনি পোস্ট করেছেন ইউইউডি অ্যালগরিদম ব্যবহার করে আমি ক্রোমে 100,000 পুনরাবৃত্তির একটি প্রাথমিক পরীক্ষা চালিয়েছি এবং কোনও সংঘর্ষ পেলাম না। এখানে একটি কোড স্নিপেট রয়েছে:

var createGUID = function() {
    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);
    });
}

var testGUIDs = function(upperlimit) {
    alert('Doing collision test on ' + upperlimit + ' GUID creations.');
    var i=0, guids=[];
    while (i++<upperlimit) {
        var guid=createGUID();
        if (guids.indexOf(guid)!=-1) {
            alert('Collision with ' + guid + ' after ' + i + ' iterations');
        }
        guids.push(guid);
    }
    alert(guids.length + ' iterations completed.');
}

testGUIDs(100000);

আপনি কি নিশ্চিত যে এখানে অন্য কিছু চলছে না?


4
হ্যাঁ, আমি কিছু স্থানীয় পরীক্ষাও চালিয়েছি এবং কোনও সংঘর্ষ পেলাম না। বিভিন্ন ব্যবহারকারীর মেশিনে উত্পন্ন উত্সগুলি ইউইউডিগুলির মধ্যে ঘটে। আমার বিভিন্ন মেশিনে কিছু ডেটা উত্পন্ন করার এবং সংঘর্ষের জন্য চেক করার প্রয়োজন হতে পারে।
মুকশা

4
এছাড়াও, আমি লক্ষ করেছি যে সংঘর্ষগুলি হ'ল 3-4 সপ্তাহের ব্যবধানে উত্পন্ন ইউইউডিগুলির মধ্যে।
মুক্সা

খুব অদ্ভুত. আপনি কোন প্লাটফর্মে চলছে?
ব্যবহারকারী533676

4
এটি V8 এর ম্যাথ.আরন্ডম () এর মধ্যে এতটা ত্রুটিপূর্ণ ত্রুটি আছে বলে মনে হয় না, তবে আপনি যদি এর পরিবর্তে চেষ্টা করতে চান তবে ক্রোমিয়াম 11 শক্তিশালী এলোমেলো সংখ্যা জেনারেশনের জন্য সমর্থন যোগ করেছে you Blog.chromium.org/2011/06/… দেখুন ।
ব্যবহারকারী533676

উইন্ডোজ 7 এবং উইন্ডোজ এক্সপির সংমিশ্রণে চলছে।
Muxa

3

মূলত এই ইউআইডি সমাধানটি পোস্ট করেছে এমন উত্তরটি 2017-06-28 এ আপডেট হয়েছিল:

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

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


0

এখানে উত্তরগুলি "কী কারণে সমস্যা সৃষ্টি করছে" তা নিয়ে আলোচনা করে? (ক্রোম ম্যাথ.অরেন্ডম বীজ সমস্যা) তবে "আমি কীভাবে এড়াতে পারি?" Not

আপনি যদি এখনও এই সমস্যাটি এড়াতে চান তবে সেক্ষেত্রে আমি এই উত্তরটি কিছুক্ষণ আগে এই সঠিক সমস্যাটি পেতে ব্রুফার কার্যকারিতা গ্রহণ করার জন্য লিখেছিলাম। এটি টাইমস্ট্যাম্পের একটি হেক্স অংশ দ্বারা প্রথম 13 হেক্স সংখ্যার অফসেট করে কাজ করে, এর অর্থ হ'ল ম্যাথ.র্যান্ডম একই বীজের উপরে থাকলেও ঠিক একই মিলিসেকেন্ডে উত্পন্ন না হলে এটি এখনও আলাদা ইউআইডি উত্পন্ন করবে।

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