كيف يمكنني تجميع بت إلى فترة طويلة لخلق هوية فريدة من نوعها؟

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

  •  11-07-2019
  •  | 
  •  

سؤال

وأود أن أكتب فائدة من شأنها أن توفر لي مع معرف فريد نسبيا في جاوة. شيء بسيط جدا، مثل بت * من الطابع الزمني + ذ بت من رقم عشوائي.

وهكذا، كيف سيكون تنفيذ الطريقة التالية:

long getUniqueID()
{
    long timestamp = System.currentTimeMillis();
    long random = some random long

    ...

    return id;
}

وBONUS

وأي اقتراحات للحصول على معلومات يمكن الحصول عليها بسهولة أخرى أتمكن من استخدام لتشكيل هويتي؟

ملاحظة: أنا على علم المعرفات الفريدة العمومية، وأنا أعرف جافا لديها الطبقة UUID، ولكن أنا لا أريد شيء 128 بت طويلة

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

المحلول

ومقطع فقط بت لا تحتاج:

return java.util.UUID.randomUUID().getLeastSignificantBits();

نصائح أخرى

ما تحاول القيام به هو إنشاء ظيفة تجزئة الذي يجمع بين قيمتين طويلة في قيمة طويلة واحدة. في هذه الحالة، التوحيد وظيفة التجزئة سوف تكون ذات أهمية قصوى منذ اصطدام في قيم ID الفريدة التي تم إنشاؤها غير مقبولة. ومع ذلك، إذا يمكنك مقارنة قيم التجزئة إلى معرفات التي تم إنشاؤها مسبقا، ثم اصطدام يمكن حلها عن طريق تعديل التجزئة حتى لا يحدث أي تصادم.

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

إذا فريدة من نوعها في نفس JVM يكفي ثم شيئا من هذا القبيل يجب القيام بهذه المهمة.

public class UniqueID {
  static long current= System.currentTimeMillis();
  static public synchronized long get(){
    return current++;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top