আমি জানি যে র্যান্ডমাইজড ইউআইডিগুলিতে তত্ত্বের সংঘর্ষের জন্য খুব, খুব কম সম্ভাবনা রয়েছে, তবে আমি ভাবছি, বাস্তবে জাভা এর randomUUID()
সংঘর্ষ না হওয়ার দিক থেকে কতটা ভাল ? কারও কি ভাগ করার কোনও অভিজ্ঞতা আছে?
আমি জানি যে র্যান্ডমাইজড ইউআইডিগুলিতে তত্ত্বের সংঘর্ষের জন্য খুব, খুব কম সম্ভাবনা রয়েছে, তবে আমি ভাবছি, বাস্তবে জাভা এর randomUUID()
সংঘর্ষ না হওয়ার দিক থেকে কতটা ভাল ? কারও কি ভাগ করার কোনও অভিজ্ঞতা আছে?
উত্তর:
ইউআইডি ব্যবহার করে java.security.SecureRandom
, যা "ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী" বলে মনে করা হয়। যদিও প্রকৃত বাস্তবায়ন নির্দিষ্ট করা হয়নি এবং এটি জেভিএম-এর মধ্যে পরিবর্তিত হতে পারে (এর অর্থ যে কোনও কংক্রিট বিবৃতি কেবল একটি নির্দিষ্ট জেভিএমের জন্য বৈধ) তবে আউটপুটটি অবশ্যই একটি পরিসংখ্যানের এলোমেলো সংখ্যা জেনারেটর পরীক্ষায় উত্তীর্ণ হতে পারে mand
কোনও বাস্তবায়নের জন্য সূক্ষ্ম বাগগুলি থাকা যা এই সমস্তটি নষ্ট করে দেয় (ওপেনএসএসএইচ কী প্রজন্মের বাগটি দেখুন) তবে জাভা ইউআইডিএসের এলোমেলোতা নিয়ে উদ্বেগ করার কোনও দৃ concrete় কারণ নেই বলে আমি মনে করি না।
উইকিপিডিয়ায় একটি খুব ভাল উত্তর রয়েছে http://en.wikedia.org/wiki/Universally_unique_ شناختfier#
কমপক্ষে একটি সংঘর্ষের 50% সম্ভাবনা থাকার জন্য এলোমেলো সংস্করণ 4 ইউআইডি'র সংখ্যা তৈরি করা দরকার যা নিম্নরূপে গণনা করা হয়:
...
এই সংখ্যাটি প্রায় 85 বছর ধরে প্রতি সেকেন্ডে 1 বিলিয়ন ইউইউডি উত্পন্ন করার সমতুল্য এবং ইউআইইডি প্রতি 16 বাইটে এই বহু ইউআইডি রয়েছে এমন একটি ফাইল প্রায় 45 টি এক্সাবাইট হবে, যা বর্তমানে বিদ্যমান বৃহত্তম ডাটাবেসের চেয়ে বহুগুণ বড়, যা চালু রয়েছে শত শত পেটাবাইটের ক্রম।
...
সুতরাং, সদৃশ হওয়ার এক বিলিয়ন সুযোগের মধ্যে একটির জন্য, 103 ট্রিলিয়ন সংস্করণ 4 ইউআইডি তৈরি করতে হবে।
UUID.randomUUID()
সম্পর্কে, কোনও প্রদত্ত নিখুঁত র্যান্ডম সংখ্যা জেনারেটরের তাত্ত্বিক সম্ভাবনার বিষয়ে নয়।
কারও কি ভাগ করার কোনও অভিজ্ঞতা আছে?
সেখানে 2^122
একটি টাইপ -4 ইউআইডি জন্য সম্ভাব্য মান । (অনুমানটি বলে যে আপনি টাইপের জন্য 2 বিট এবং সংস্করণ সংখ্যার জন্য আরও 4 বিট হারাবেন))
ধরে নিই যে আপনি এক সেকেন্ডে 1 মিলিয়ন এলোমেলো ইউআইডি তৈরি করবেন, আপনার জীবদ্দশায় একটি সদৃশ হওয়ার সম্ভাবনা খুব অদৃশ্য হবে। এবং সদৃশটি সনাক্ত করতে, আপনাকে আগে 1 টি উত্পন্ন উত্সাহের সমস্ত ইউডিউইডের সাথে প্রতি সেকেন্ডে 1 মিলিয়ন নতুন ইউআইডি তুলনা করার সমস্যাটি সমাধান করতে হবে !
যে কেউ সম্ভাবনা দেখেছেন (যেমন বাস্তবে লক্ষ্য করেছেন) বাস্তব জীবনে ডুপ্লিকেট ) তা অদৃশ্যভাবে ছোটের চেয়েও ছোট ... সংঘর্ষের সন্ধানের ব্যবহারিক অসুবিধার কারণে।
এখন অবশ্যই, আপনি সাধারণত ছদ্ম-র্যান্ডম নম্বর জেনারেটর ব্যবহার করবেন, সত্যিকারের এলোমেলো সংখ্যার উত্স নয়। তবে আমি মনে করি আমরা নিশ্চিত হতে পারি যে আপনি যদি নিজের ক্রিপ্টোগ্রাফিক শক্তি এলোমেলো সংখ্যার জন্য কোনও বিশ্বাসযোগ্য সরবরাহকারী ব্যবহার করেন তবে তা ক্রিপ্টোগ্রাফিক শক্তি হবে এবং পুনরাবৃত্তি হওয়ার সম্ভাবনাটি আদর্শ (অ-পক্ষপাতহীন) এলোমেলো সংখ্যার জেনারেটরের মতো হবে will ।
তবে, আপনি যদি একটি "ভাঙ্গা" ক্রিপ্টো-র্যান্ডম নম্বর জেনারেটর সহ কোনও জেভিএম ব্যবহার করেন, সমস্ত বেট বন্ধ রয়েছে। (এবং এটিতে কিছু সিস্টেমে "এনট্রপি সংকট" সমস্যাগুলির জন্য কিছু কাজের ক্ষেত্র অন্তর্ভুক্ত থাকতে পারে Or অথবা কেউ আপনার জেআরইতে আপনার সিস্টেমে বা উপরিভাগে টিনক করেছে এমন সম্ভাবনা))
1 - ধরে নেই যে আপনি কোনও বেনামে মন্তব্যকারী হিসাবে "" কিছু ধরণের বাইনারি বিট্রি "ব্যবহার করেছেন, প্রতিটি ইউআইডি O(NlogN)
-র বিটগুলির N
কম ঘনত্ব এবং এলোমেলো বিতরণ ধরে স্বতন্ত্র ইউআইডিগুলিকে উপস্থাপন করার জন্য র্যাম মেমরির বিট লাগবে । এখন এটির 1,000,000 এবং আপনি যে সেকেন্ডের জন্য পরীক্ষাটি চালাতে চলেছেন তার সংখ্যাটি গুন করুন। আমি মনে করি না যে এটি একটি উচ্চ মানের আরএনজির সংঘর্ষের জন্য পরীক্ষা করার জন্য প্রয়োজনীয় সময়ের জন্য বাস্তবিক। এমনকি (অনুমানমূলক) চতুর উপস্থাপনা সহ নয়।
আমি কোনও বিশেষজ্ঞ নই, তবে আমি ধরে নিয়েছি যে যথেষ্ট স্মার্ট লোক বছরের পর বছর ধরে জাভার র্যান্ডম নম্বর জেনারেটরের দিকে নজর রেখেছিল। অতএব, আমিও ধরে নিয়েছি যে এলোমেলো ইউআইডিগুলি ভাল। তাই আপনি যদি সত্যিই তাত্ত্বিক সংঘর্ষের সম্ভাবনা থাকা উচিত (যা 1 সম্পর্কে: 3 × 10 ^ 38 ।? সব সম্ভব UUID জানা জন্য নেই কেহ জানেন কিভাবে শুধুমাত্র র্যান্ডম UUID জানা এই পরিবর্তন আনা হয়েছে তা কি 1/(16*4)
উপরোক্ত?)
আমার ব্যবহারিক অভিজ্ঞতা থেকে, আমি এখনও পর্যন্ত কোনও সংঘর্ষ দেখিনি। যেদিন আমি আমার প্রথমটি পেয়েছি আমি সম্ভবত অবাক হয়ে দীর্ঘ দাড়ি বাড়িয়েছি;)
একজন প্রাক্তন নিয়োগকর্তার কাছে আমাদের কাছে একটি অনন্য কলাম ছিল যাতে একটি র্যান্ডম ইউইড থাকে। এটি স্থাপনের পরে প্রথম সপ্তাহে আমরা একটি সংঘর্ষ পেয়েছিলাম। অবশ্যই, প্রতিক্রিয়াগুলি কম তবে সেগুলি শূন্য নয়। এজন্য লগ 4 জ 2 এ ইউইউডিটিল.জেটটাইমবেসডউইউড রয়েছে। এটি একটি ইউইউডি উত্পন্ন করবে যা 8,925 বছরের জন্য অনন্য as যতক্ষণ না আপনি একক সার্ভারে 10,000 ইউইউডি / মিলিসেকেন্ডের বেশি তৈরি করেন না।
ইউইউডিগুলির জন্য আসল প্রজন্মের স্কিমটি ছিল ইউইউডি উত্পন্ন করছে এমন কম্পিউটারের ম্যাক ঠিকানা এবং পশ্চিমে গ্রেগরিয়ান ক্যালেন্ডার গ্রহণের পর থেকে 100-ন্যানোসেকেন্ড ব্যবধানের সাথে ইউআইডি সংস্করণকে একত্রিত করা। মহাকাশের একক পয়েন্ট (কম্পিউটার) এবং সময়ের (অন্তরগুলির সংখ্যা) উপস্থাপন করে, মূল্যবোধগুলির সংঘর্ষের সম্ভাবনা কার্যকরভাবে শূন্য হয়।
সংঘর্ষের 50% সুযোগে পৌঁছতে কতগুলি ইউআইডি তৈরি করতে হবে তার উত্তরের অনেকগুলি আলোচনা করে। তবে 50%, 25% বা এমনকি 1% সংঘর্ষের সম্ভাবনা কোনও অ্যাপ্লিকেশনটির পক্ষে মূল্যহীন নয় যেখানে সংঘর্ষ অবশ্যই (কার্যত) অসম্ভব হতে পারে।
প্রোগ্রামাররা কি নিয়মিতভাবে "অসম্ভব" হিসাবে অন্যান্য ঘটনাগুলি ঘটতে পারে এবং ঘটতে পারে?
আমরা যখন কোনও ডিস্ক বা মেমরিতে ডেটা লিখি এবং এটি আবার পড়ি, তখন আমরা ডেটা সঠিক বলে মনে করি। আমরা কোনও দুর্নীতি সনাক্ত করতে ডিভাইসের ত্রুটি সংশোধনের উপর নির্ভর করি। তবে সনাক্ত করা ত্রুটির সম্ভাবনা আসলে প্রায় 2 -50 এর কাছাকাছি ।
এলোমেলো ইউআইডিগুলিতে কি একই জাতীয় মান প্রয়োগ করা বুদ্ধিমান হবে না? যদি আপনি এটি করেন তবে আপনি দেখতে পাবেন যে প্রায় 100 বিলিয়ন এলোমেলো ইউইউডিজে ( 36.5 ডলার ) সংকলনে একটি "অসম্ভব" সংঘর্ষ সম্ভব ।
এটি একটি জ্যোতির্বিদ্যা সংক্রান্ত সংখ্যা, তবে জাতীয় স্বাস্থ্যসেবা সিস্টেমে আইটেমাইজড বিলিংয়ের মতো অ্যাপ্লিকেশনগুলি বা ডিভাইসের একটি বড় অ্যারে উচ্চ ফ্রিকোয়েন্সি সেন্সর ডেটা লগিংয়ের মতো অ্যাপ্লিকেশনগুলি এই সীমাগুলিতে অবশ্যই প্রবেশ করতে পারে। আপনি যদি গ্যালাক্সিতে পরবর্তী হিচিকার নির্দেশিকাটি লিখছেন তবে প্রতিটি নিবন্ধে ইউআইডিগুলিকে বরাদ্দ করার চেষ্টা করবেন না!
যেহেতু বেশিরভাগ উত্তর তত্ত্বকে কেন্দ্র করে আমার মনে হয় যে আমি আমার ব্যবহারিক পরীক্ষা দিয়ে আলোচনায় কিছু যুক্ত করতে পারি। আমার ডাটাবেসে আমার জাভা 8 ইউআইডি.আরন্ডম ইউইউডি () ব্যবহার করে প্রায় 4.5 মিলিয়ন ইউআইডি উত্পন্ন হয়েছে। নিম্নলিখিতগুলি কেবলমাত্র আমি জানতে পেরেছি:
c0f55f62 -b990-47bc-8caa-f42313669948
c0f55f62 -e81e-4253-8299-00b4322829d5
c0f55f62 -4979-4e87-8cd9-1c556894e2bb
b9ea2498-fb32-40ef-91ef-0ba 00060fe64
be87a209-2114-45b3-9d5a-86d 00060fe64
4a8a74a6-e972-4069-b480-বি dea1177b21f
12fb4958-bee2-4c89-8cf8-e dea1177b21f
যদি এটি সত্যই এলোমেলো হয়ে থাকে তবে এই জাতীয় অনুরূপ ইউআইডি থাকার সম্ভাবনা যথেষ্ট কম হবে (সম্পাদনা দেখুন), যেহেতু আমরা কেবলমাত্র 4.5 মিলিয়ন এন্ট্রি বিবেচনা করছি। সুতরাং, যদিও এই ক্রিয়াটি থাকার দুর্ঘটনায় পরিপ্রেক্ষিতে ভাল হয়, আমার জন্য এটি বলে মনে হচ্ছে না যে ভাল যেমন তত্ত্ব হবে।
সম্পাদনা করুন :
অনেক লোক এই উত্তরটি বুঝতে পারে না বলে মনে হচ্ছে তাই আমি আমার বক্তব্য পরিষ্কার করব: আমি জানি যে মিলগুলি "ছোট" এবং সম্পূর্ণ সংঘর্ষের থেকে অনেক দূরে। যাইহোক, আমি কেবল জাওয়ার ইউআইডি.আরআন্ডম ইউআইডি () কে সত্যিকারের এলোমেলো সংখ্যা জেনারেটরের সাথে তুলনা করতে চেয়েছিলাম, এটিই আসল প্রশ্ন।
সত্যিকারের এলোমেলো সংখ্যার জেনারেটরে, শেষের ঘটনার সম্ভাবনা প্রায় = 0.007% হতে পারে । অতএব, আমি মনে করি আমার উপসংহার দাঁড়িয়েছে।
সূত্রটি এই উইকি নিবন্ধে en.wikedia.org/wiki/ জন্মদিন_প্রবলে ব্যাখ্যা করা হয়েছে
আমি গত বছর লটারিতে খেলি, এবং আমি কখনই জিতি না .... তবে মনে হয় লটারিতে বিজয়ী রয়েছে ...
ডক: http://tools.ietf.org/html/rfc4122
প্রকার 1: বাস্তবায়িত হয়নি। সংঘর্ষ সম্ভব যদি একই মুহুর্তে ইউইডির উত্পন্ন হয়। এই সমস্যাটিকে বাইপাস করতে ইমপ্লিট কৃত্রিমভাবে একটি-সিঙ্ক্রোনাইজ করা যায়।
প্রকার 2: কোনও প্রয়োগ কখনও দেখবেন না।
প্রকার 3: এমডি 5 হ্যাশ: সংঘর্ষ সম্ভব (128 বিট -2 প্রযুক্তিগত বাইট)
প্রকার 4: এলোমেলো: সংঘর্ষ সম্ভব (লটারি হিসাবে)। নোট করুন যে jdk6 ইমপ্ল একটি "সত্য" সুরক্ষিত র্যান্ডম ব্যবহার করবে না কারণ পিআরএনজি অ্যালগরিদম বিকাশকারী দ্বারা চয়ন করা হয়নি এবং আপনি সিস্টেমটিকে "দুর্বল" পিআরএনজি আলগো ব্যবহার করতে বাধ্য করতে পারেন। সুতরাং আপনার ইউইউডি অনুমানযোগ্য।
প্রকার 5: sha1 হ্যাশ: প্রয়োগ করা হয়নি: সংঘর্ষ সম্ভব (160 বিট -2 প্রযুক্তিগত বাইট)