احتمال الاصطدام باستخدام أهم أجزاء من UUID في جافا

StackOverflow https://stackoverflow.com/questions/325443

  •  11-07-2019
  •  | 
  •  

سؤال

إذا أنا باستخدام Long uuid = UUID.randomUUID().getMostSignificantBits() ما هو احتمال الحصول على الاصطدام.فإنه يقطع الأقل أهمية بت ، لذلك هناك احتمال أن تقوم بتشغيل في تصادم, صحيح ؟

هل كانت مفيدة؟

المحلول

وفقا الوثائق, ثابت طريقة UUID.randomUUID() يولد نوع 4 UUID.

وهذا يعني أن ستة أجزاء تستخدم في نوع المعلومات المتبقية 122 بت بشكل عشوائي.

الست غير عشوائية بت يتم توزيعها مع أربعة في أهم نصف UUID اثنين في الأقل أهمية النصف.لذلك أهم نصف UUID يحتوي على 60 بت من العشوائية ، مما يعني أنك في المتوسط تحتاج إلى توليد 2^30 UUIDs للحصول على الاصطدام (مقارنة مع 2^61 كاملة UUID).

لذلك أود أن أقول أن كنت بدلا من ذلك آمنة.ولكن لاحظ أن هذا ليس صحيحا على الاطلاق لأنواع أخرى من UUIDs ، كارل Seleborg يذكر.

بالمناسبة, هل سيكون أفضل قليلا قبالة باستخدام الأقل أهمية نصف UUID (أو مجرد توليد عشوائي طويلة باستخدام SecureRandom).

نصائح أخرى

وريمون تشن ديه بلوق وظيفة ممتازة حقا على هذا:

المعرفات الفريدة العمومية

هي فريدة من نوعها على مستوى العالم، ولكن فرعية من المعرفات الفريدة العمومية ليست

وأنا يفكر هذا هو أفضل مثال لاستخدام randomUUID:

http://www.javapractices.com/topic/TopicAction.do؟ معرف = 56

وأنت أفضل حالا مجرد توليد قيمة طويلة عشوائية، ثم كل بت بشكل عشوائي. في جاوة 6، عشوائية الجديد () يستخدم System.nanoTime ()، بالإضافة إلى مكافحة كبذرة.

وهناك مستويات مختلفة من التفرد.

إذا كنت تحتاج تفرد عبر العديد من الأجهزة، هل يمكن أن يكون جدول قاعدة بيانات مركزية لتخصيص معرفات فريدة من نوعها، أو حتى دفعات من هويات فريدة من نوعها.

إذا كنت بحاجة فقط ليكون التفرد في تطبيق واحد، هل يمكن أن يكون مجرد عداد (أو العداد الذي يبدأ من currentTimeMillis () * 1000 أو nanoTime () اعتمادا على الاحتياجات الخاصة بك)

واستخدام الوقت YYYYDDDD (السنة + يوم من السنة) كما البادئة. هذا يقلل تجزئة قاعدة البيانات في الجداول والفهارس. هذا الأسلوب بإرجاع byte[40]. اعتدت عليه في بيئة مختلطة حيث خدمة Active Directory SID (varbinary(85)) هو المفتاح لمستخدمي LDAP ويتم استخدام الرقم الذي تم إنشاؤه تلقائيا طلب عدم LDAP-المستخدمين. أيضا عدد كبير من المعاملات يوميا في الجداول المعاملات (الصناعة المصرفية) لا يمكن استخدام أنواع 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top