كيفية توليد أرقام فريدة أقل من 8 أحرف طويلة

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

  •  22-09-2019
  •  | 
  •  

سؤال

أرغب في إنشاء معرف فريد في كل مرة أسميها methode generateCustumerId (). يجب أن يكون المعرف الذي تم إنشاؤه 8 أحرف طويلة أو أقل من 8 أحرف. هذا المطلب ضروري لأنني بحاجة إلى تخزينه في ملف بيانات ويتم تحديد المخطط ليكون طوله 8 أحرف لهذا المعرف.

الخيار 1 يعمل بشكل جيد. بدلاً من الخيار 1 ، أريد استخدام UUID. المشكلة هي أن UUID يولد معرفًا يحتوي على العديد من الشخصيات. هل يعرف أحدهم كيفية إنشاء معرف فريد أقل من 99999999؟

الخيار 1

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class CustomerIdGenerator {

private static Set<String> customerIds = new HashSet<String>();
private static Random random = new Random();

// XXX: replace with java.util.UUID
public static String generateCustumerId() {

    String customerId = null;
    while (customerId == null || customerIds.contains(customerId)) {
        customerId = String.valueOf(random.nextInt(89999999) + 10000000);
    }
    customerIds.add(customerId);
    return customerId;
}

}

يولد Option2 معرفًا فريدًا طويلًا جدًا

 public static String generateCustumerId() {
    String ownerId = UUID.randomUUID().toString();
    System.out.println("ownerId " + ownerId);
    return ownerId
}
هل كانت مفيدة؟

المحلول

هل يجب أن تكون فريدة أو عشوائية؟ إذا كانت هناك حاجة فقط إلى أن تكون فريدة من نوعها ، فيمكنك تحميل أعلى قيمة من مخزن البيانات عند إطلاق التطبيق (على افتراض أن تطبيق واحد فقط يكتب إلى ملف البيانات). واحد لديك أعلى قيمة لك:

public class IdGenerator{
  private String value;

  public IdGenerator( String initial value ){
    this.value = value;
  }

  public synchronized String nextValue(){
    value = incrementValue( value );
    return value;
  }

  private static String nextValue( String currentValue ){
    // Somehow increment the value.
    return incrementedValue;
  }

}

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

نصائح أخرى

ربما مشروع معرف العموم من بعض الاستخدام. ال مولد أبجدي رقمي (ومولداتهم الأخرى كذلك) تأخذ حجة طول. بالطبع ، هذا يدعم تسلسلًا (مما يعني أنه سيتعين عليك معرفة /تحديد آخر معرف أعلى في إعادة تشغيل التطبيق).

بدلاً من ذلك ، قد تجرب شيئًا مثل اختبارات CRC-32 من الوقت المحلي أو مجموعة من البايتات التي تم إنشاؤها عشوائيًا (CRC32 بنيت في مكتبة جافا القياسية).

ليس أفضل حل في العالم ، ولكن ماذا عن تقطيع Uuid إلى الطول؟ لن تكون فريدة من نوعها على مستوى العالم - فقط كن على دراية بأنك لن تحصل على معرف فريد من نوعه على المستوى العالمي - ولكنه قد ينجح فريدة من نوعها محليًا.

حافظ على عداد مستمر يزيد من قبل واحد في كل مرة يتم فيها طلب معرف جديد.

إذا كان ملف البيانات عبارة عن جدول SQL ، فيمكنك دائمًا تحديد Max (id) + 1 ، واستخدامه ، ولكن عليك أن تكون متأكدًا تمامًا من أنك لا تواجه مشكلات متعددة المهام عند الحاجة إلى اثنين من المعرف في نفس الوقت (وهم هم كلاهما له نفس القيمة من الحد الأقصى (المعرف)). لاحظ أن معظم قواعد البيانات لديها نوع بيانات أصلي مصمم لهذا الغرض ولأي برنامج غير تافهة ، يجب عليك استخدام هذا المرفق.

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