سؤال

كيفية إنشاء معرف فريد من نوعه وهو عدد صحيح في جافا لا تخمن الرقم التالي؟

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

المحلول

ما مدى فريدة من نوعها؟

إذا كانت فريدة من نوعها فقط في عملية ما ، فيمكنك استخدام AtomicInteger و اتصل incrementAndGet() في كل مرة تحتاج إلى قيمة جديدة.

نصائح أخرى

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

يضيف synchronized إذا كنت تريد أن يكون موضوع آمن.

من السهل إذا كنت مقيدًا إلى حد ما.

إذا كان لديك مؤشر ترابط واحد ، فأنت فقط تستخدم فريدة ++ ؛ تأكد من تخزين FrequeId الحالي عند الخروج.

إذا كان لديك عدة مؤشرات ترابط ، فإن طريقة cenertuniqueid متزامنة شائعة تعمل (تم تنفيذها كما هو مذكور أعلاه).

المشكلة هي عندما يكون لديك العديد من وحدات المعالجة المركزية-إما في مجموعة أو بعض الإعدادات الموزعة مثل لعبة نظير إلى نظير.

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

return (myID << 16) & uniqueID++

قد يكون من الصعب توزيع جزء "Myid" ، ولكن هناك بعض الطرق. يمكنك فقط الحصول على واحدة من قاعدة بيانات مركزية ، وطلب معرف فريد من خادم مركزي ، ...

إذا كان لديك فترة طويلة بدلاً من INT ، فإن إحدى الحيل الشائعة هي أخذ معرف الجهاز (UUID) لـ ETH0 ، فهذا مضمون أن تكون فريدًا لخادم-ثم أضف فقط على الرقم التسلسلي.

إذا كنت تعني حقًا عدد صحيح بدلاً من int:

Integer id = new Integer(42); // will not == any other Integer

إذا كنت تريد شيئًا مرئيًا خارج JVM لعمليات أخرى أو للمستخدم أو المستمر أو مجموعة من الاعتبارات الأخرى ، فهناك طرق أخرى ، ولكن بدون سياق ، ربما تكون أفضل حالًا باستخدام التفرد المدمج لهوية الكائن داخل نظامك.

ما عليك سوى إنشاء معرف وتحقق مما إذا كان موجودًا بالفعل أم لا في قائمة المعرفات التي تم إنشاؤها.

هل تحتاج إلى أن تكون ؛

  • فريدة من نوعها بين اثنين من JVMs تعمل في نفس الوقت.
  • فريدة من نوعها حتى لو تم إعادة تشغيل JVM.
  • آمن الخيط.
  • دعم NULL؟ إذا لم يكن كذلك ، استخدم int أو طويل.
 import java.util.UUID;

 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }

    // XXX: replace with java.util.UUID

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }

}

آمل أن يساعدك هذا.

فريدة من نوعها في أي وقت:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top