سؤال

أحتاج إلى إنشاء عدد فريد من 32 بت في جافا. أحتاج إلى إرجاع الرقم على أنه Java Int ، وهو ما يتطلبه الواجهة. هل يمكنك مشاركة بعض الأفكار حول هذا؟

سيتم استخدام الرقم باعتباره MySQL PK ويمكن أن تقوم العديد من المواضيع بإنشاء معرف فريد من نوعه في نفس الوقت. (آسف أنه يقرر عدم استخدام معرف MySQL التزايدي)

لقد جربت فئة UUID ، لكن يبدو أن البيانات التي يتم إنشاؤها لديها أجزاء أكثر مما يمكنني استخدامه.

لقد وجدت هذا ولكن لست متأكدًا مما إذا كان يعمل:

    // seems no way to get int
    UUID id = UUID.randomUUID();
    System.out.println(id);

    // not working either?
    java.rmi.server.UID uid = new java.rmi.server.UID();
    System.out.println(uid.toString());

    // the one i am using
    SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
    prng.setSeed(System.currentTimeMillis());
    int ret = prng.nextInt();
    System.out.println(ret);
هل كانت مفيدة؟

المحلول

كيف "فريدة" تريد؟ باختصار ، ما هو مجال التصادم؟ إذا كنت تتعامل مع الآلاف من المفاتيح Random.NextInt () يفعل بالضبط ما تريده بالنسبة لما جربته مع الإصدار 4 uuids (Uuid V4 يولد 128 بت عشوائي).

إذا كنت بحاجة إلى شيء أقل فرصة للتصادم ، فأنت بحاجة إلى وجود عدد صحيح متزايد عالميًا ولكن هناك الكثير من العناية التي يجب اتخاذها هنا مثل الحفاظ على الحالة بين الشركات الناشئة JVM. لذلك يجب أن تبحث في atomicintegers.

نصائح أخرى

ال SecureRandom النهج جيد ، لكن لا تضع البذور عليها. سيختار بذورها بطريقة آمنة (من المفترض).

يمكنك أيضًا استخدام uuid وتجاهل البتات التي لا تحتاجها ، على سبيل المثال

int key = (int)UUID.randomUUID().getLeastSignificantBits();

تحرير: يجب أن تدرك أيضًا أن SecureRandom أبطأ بكثير من Random. نظرًا لأنك لا تقوم بالتشفير هنا ، فلماذا لا تستخدم Random?

أعتقد أنه يمكنك استخدام وظيفة التجزئة 32 بت. وترد التفاصيل في البرنامج التعليمي التاليhttp://www.concentric.net/~ttwang/tech/inthash.htm

private static int hash(int key){

          key = ~key + (key << 15); // key = (key << 15) - key - 1;
          key = key ^ (key >>> 12);
          key = key + (key << 2);
          key = key ^ (key >>> 4);
          key = key * 2057; // key = (key + (key << 3)) + (key << 11);
          key = key ^ (key >>> 16);
          return key;

    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top