জাভাতে কোনও ইউআইডি-র সবচেয়ে উল্লেখযোগ্য বিট ব্যবহার করে সংঘর্ষের সম্ভাবনা


235

যদি আমি ব্যবহার করি Long uuid = UUID.randomUUID().getMostSignificantBits()তবে এটির সংঘর্ষের সম্ভাবনা কতটা। এটি সর্বনিম্ন তাৎপর্যপূর্ণ বিটগুলি কেটে ফেলেছে, তাই সম্ভবত আপনি কোনও সংঘর্ষে চলে যাওয়ার সম্ভাবনা আছে, তাই না?

উত্তর:


213

ডকুমেন্টেশন অনুসারে , স্ট্যাটিক পদ্ধতিটি UUID.randomUUID()একটি প্রকার 4 ইউআইডি উত্পন্ন করে।

এর অর্থ হ'ল ছয়টি বিট কিছু প্রকারের তথ্যের জন্য ব্যবহৃত হয় এবং বাকি 122 বিট এলোমেলোভাবে বরাদ্দ করা হয়।

ছয়টি নন-এলোমেলো বিটগুলি ইউআইডি-র সবচেয়ে উল্লেখযোগ্য অর্ধে চারটি এবং কমপক্ষে উল্লেখযোগ্য অর্ধেক অংশে দুটি দিয়ে বিতরণ করা হয়। সুতরাং আপনার ইউইউডি-র সবচেয়ে উল্লেখযোগ্য অর্ধেকটি এলোমেলোভাবে b০ বিট ধারণ করে যার অর্থ আপনি একটি সংঘর্ষের জন্য গড়পড়তা 2 ^ 30 ইউআইডি উত্পন্ন করতে হবে (সম্পূর্ণ ইউইউডিটির জন্য 2 ^ 61 এর তুলনায়)।

সুতরাং আমি বলব যে আপনি বরং নিরাপদ। নোট করুন, তবে কার্ল সেলেবর্গ যেমন উল্লেখ করেছেন তেমন এটি অন্যান্য ধরণের ইউআইডি-র ক্ষেত্রে একেবারেই সত্য নয়।

ঘটনাক্রমে, আপনি ইউআইডি'র সর্বনিম্ন উল্লেখযোগ্য অর্ধেক ব্যবহার করে (বা সিকিউরর্যান্ডম ব্যবহার করে কেবল একটি এলোমেলো দীর্ঘ উত্পাদন করে) কিছুটা ভাল হয়ে যাবেন।


3
আমি নিশ্চিত যে এটি পুরোপুরি সঠিক কিনা - বাস্তবায়নের দিকে তাকালে এটি স্পষ্ট হয় যে সংস্করণ / বৈকল্পিক তথ্য সর্বাধিক তাৎপর্যপূর্ণ বিটগুলিতে সংরক্ষিত নেই, বরং মাঝখানে কোথাও রয়েছে।
টম

2
@ রসমাস ফ্যাবার টমের মন্তব্য সঠিক: এখানে উত্তরটি ছয়টি উল্লেখযোগ্য বিট টাইপ সম্পর্কিত তথ্য সম্পর্কে ভুল । প্রকৃতপক্ষে নন-এলোমেলো তথ্যের ছয়টি বিট রয়েছে তবে চারটি বিট সংস্করণ 4 এবং অন্যান্য দুটি বিট সংরক্ষণ করে। চার এবং দুটি বিট 128-বিট মানটির মাঝের কাছে বিভিন্ন অবস্থানে অবস্থিত। দেখুন Wikipedia নিবন্ধটি
তুলসী বাউরক

56

রেমন্ড চেনের এ সম্পর্কে সত্যিই দুর্দান্ত একটি ব্লগ পোস্ট রয়েছে:

জিইউইডিগুলি বিশ্বব্যাপী অনন্য, তবে জিইউইডিগুলির সাবস্ট্রিংগুলি নয়


1
লিঙ্কটি আর মারা যায় নি।
ডেভিড ভেসেলোভস্কি 10

3
লিঙ্কটি আবার মারা গেছে। এখানে একটি ওয়েব সংরক্ষণাগার সংস্করণের লিঙ্ক
কুবা স্পাতনি


10

আপনি কেবল একটি এলোমেলো দীর্ঘ মান উত্পন্ন করা ভাল, তারপরে সমস্ত বিট এলোমেলো। জাভা 6-এ, নতুন র্যান্ডম () System.nanoTime () এবং বীজ হিসাবে একটি কাউন্টার ব্যবহার করে।

স্বতন্ত্রতার বিভিন্ন স্তর রয়েছে।

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

যদি আপনার কেবলমাত্র একটি অ্যাপ্লিকেশনে স্বতন্ত্রতা থাকতে হয় তবে আপনার কেবলমাত্র একটি কাউন্টার (বা বর্তমানের টাইমমিলিস () * 1000 বা ন্যানোটাইম () আপনার প্রয়োজনীয়তার উপর নির্ভর করে শুরু হতে পারে) পেতে পারেন


7

YYYYDDDDউপসর্গ হিসাবে সময় (বছর + বছরের দিন) ব্যবহার করুন । এটি সারণী এবং সূচীগুলিতে ডাটাবেস বিভাজন হ্রাস করে। এই পদ্ধতিটি ফিরে আসে byte[40]। আমি এটিকে একটি হাইব্রিড পরিবেশে ব্যবহার করেছি যেখানে অ্যাক্টিভ ডিরেক্টরি এসআইডি ( varbinary(85)) এলডিএপি ব্যবহারকারীদের জন্য কী এবং একটি অ্যাপ্লিকেশন স্বয়ংক্রিয়-জেনারেট আইডি নন-এলডিএপি ব্যবহারকারীদের জন্য ব্যবহৃত হয়। এছাড়াও লেনদেনের টেবিলগুলিতে প্রতিদিন বিপুল সংখ্যক লেনদেন (ব্যাংকিং শিল্প) Intকীগুলির জন্য মানক প্রকার ব্যবহার করতে পারে না

private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");

public static byte[] getSidWithCalendar() {
    Calendar cal = Calendar.getInstance();
    String val = String.valueOf(cal.get(Calendar.YEAR));
    val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
    val += UUID.randomUUID().toString().replaceAll("-", "");
    return val.getBytes();
}

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