سؤال

لدي كائن بالخصائص التالية


دائرة المخابرات العامة
بطاقة تعريف
شفرة
اسم

لا يرغب بعض العملاء في إدخال الرمز، لذا كانت الخطة الأولية هي وضع المعرف في الكود ولكن الكائن الأساسي للORM مختلف لذا فأنا مخطئ ...

كانت خطتي هي وضع ####-#### قيم عشوائية تمامًا في الكود، كيف يمكنني إنشاء شيء من هذا القبيل، مثل أشياء من نوع المولد التسلسلي لنظام التشغيل Windows 7، ولكن لن يكون لذلك أي عبء، فماذا ستفعل في هذه الحالة.

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

المحلول

هل تريد قيمة عشوائية أم قيمة فريدة؟

عشوائي! = فريد.

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

أنا شخصياً أوصي باستخدام الدليل مع بعض السياق [راجع أسهل القسم أدناه].لقد قدمت أيضًا بعض الاقتراحات الأخرى حتى يكون لديك خيارات، اعتمادًا على حالتك.


أسهل

إذا كانت التعليمات البرمجية عبارة عن سلسلة غير محدودة [أي يمكن أن تكون بأي طول]، فإن أسهل وسيلة شبه مقروءة لإنشاء تعليمات برمجية فريدة هي

OrmObject ormObject= new OrmObject ();
string code = string.
    Format ("{0} [{1}]", ormObject.Name, Guid.NewGuid ()).
    Trim ();
// generates something like
// "My Product [DA9190E1-7FC6-49d6-9EA5-589BBE6E005E]"

يمكنك استبدال ormObject.Name لأي سلسلة مميزة.سأستخدم عادة typeof (objectInstance.GetType ()).Name ولكن هذا لن ينجح إلا إذا كانت OrmObject فئة أساسية، وإذا كانت فئة محددة تستخدم من أجلها كل شئ سينتهي بهم الأمر جميعًا بعلامات مماثلة.الهدف هو إضافة بعض سياقات المستخدم، مثل - كما في @Yuriy Faktorovich المشار إليه وتف المادة - المستخدمين لديهم شئ ما ليقرأ.


عشوائي

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

إذا قرأت ذلك، فيمكنك بسهولة كتابة طريقة تمديد، على سبيل المثال

public static class IRandomExtensions
{
    public static CodeType GetCode (this IRandom random)
    {
        // 1. get as many random bytes as required
        // 2. transform bytes into a 'Code'
        // 3. bob's your uncle
        ...
    }
}

    // elsewhere in code
    ...
    OrmObject ormObject = new OrmObject ();
    ormObject.Code = random.GetCode ();
    ...

لتوليد قيمة بالفعل، أود أن أقترح تنفيذ IRandom واجهة مع أ System.Security.Cryptography.RNGCryptoServiceProvider تطبيق.سيؤدي التنفيذ المذكور إلى إنشاء مخزن مؤقت قدره X بايت عشوائي، وتوزيع أكبر عدد ممكن من البايتات، مما يؤدي إلى إعادة إنشاء الدفق عند استنفاده.

علاوة على ذلك - لا أعرف لماذا أواصل الكتابة، أعتقد أن هذه المشكلة رائعة حقًا!- إذا كان CodeType عبارة عن سلسلة وتريد شيئًا قابلاً للقراءة، فيمكنك فقط أخذ البايتات العشوائية المذكورة وتحويلها إلى سلسلة قابلة للقراءة "على ما يبدو" عبر تحويل Base64

public static class IRandomExtensions
{
    // assuming 'CodeType' is in fact a string
    public static string GetCode (this IRandom random)
    {
        // 1. get as many random bytes as required
        byte[] randomBytes; // fill from random
        // 2. transform bytes into a 'Code'
        string randomBase64String = 
            System.Convert.ToBase64String (randomBytes).Trim ("=");
        // 3. bob's your uncle
        ...
    }
}

يتذكر

عشوائي! = فريد.

قيمك سوف يكرر.مؤخراً.


فريد

هناك عدد من الأسئلة التي عليك أن تطرحها على نفسك بشأن مشكلتك.

  1. يجب على الجميع Code تكون القيم فريدة من نوعها؟[إذا لم يكن الأمر كذلك، فأنت تحاول جاهدًا]
  2. ما هو النوع Code؟[إذا كانت هناك سلسلة طويلة، فاستخدم المرشد الكامل]
  3. هل هذا تطبيق موزع؟[إذا لم يكن الأمر كذلك، فاستخدم قيمة قاعدة البيانات كما اقترحها @LBushkin أعلاه]
  4. إذا كان تطبيقًا موزعًا، فهل يمكن لتطبيقات العميل إنشاء مثيلات لهذه الكائنات وإرسالها؟[إذا كان الأمر كذلك، فأنت تريد معرفًا فريدًا عالميًا، ومرة ​​أخرى تعد الأدلة الإرشادية رهانًا أكيدًا]

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

أتمنى أن يساعدك هذا :)

راجع للشغل، سوف تتلقى حلول ذات جودة أفضل إذا قمت بنشر المزيد من التفاصيل [أي القيود] حول مشكلتك.مرة أخرى، ما هو النوع Code, هل هناك قيود على الطول؟قيود التنسيق؟قيود الشخصية؟

أرج، التعديل الأخير، I يُقسم.إذا انتهى بك الأمر إلى استخدام الأدلة، فقد ترغب في تشويش ذلك، أو حتى "ضغط" تمثيلها عن طريق تشفيرها في base64 - على غرار تحويل base64 أعلاه للأرقام العشوائية.

public static class GuidExtensions
{
    public static string ToBase64String (this Guid id)
    {
        return System.Convert.
            ToBase64String (id.ToByteArray ()).
            Trim ("=");
    }
}

على عكس الاقتطاع، فإن تحويل Base64 هو لا تحول خاسر.بالطبع، يعد القطع أعلاه ضارًا في سياق توسيع Base64 الكامل - ولكن = هي مجرد حشوة، وتم تقديم معلومات إضافية بواسطة التحويل، وليس جزءًا من بيانات الدليل الأصلية.اذا أردت الذهاب خلف إلى Guid من قيمة Base64 المحولة، فسيتعين عليك إعادة وضع سلسلة Base64 الخاصة بك حتى يصبح طولها من مضاعفات 4 - لا تسأل، فقط ابحث عن base64 إذا كنت مهتمًا :)

نصائح أخرى

هل يمكن إنشاء GUID باستخدام:

Guid.NewGuid().ToString();

وسيكون تعطيك شيئا مثل:

<اقتباس فقرة>   

و788E94A0-C492-11DE-BFD4-FCE355D89593

استخدم عمود الترقيم التلقائي أو التسلسل من قاعدة البيانات الخاصة بك لتوليد قانون رقم فريد من نوعه. تقريبا جميع قواعد البيانات الحديثة تدعم ولدت تلقائيا الأرقام في شكل واحد أو آخر. انظروا إلى ما يدعم قاعدة البيانات.

مضمونة

والقيم الترقيم التلقائي / التسلسل من DB لتكون فريدة من نوعها وغير مكلفة نسبيا الحصول عليها. إذا كنت ترغب في تجنب أرقام تسلسلية تماما المخصصة لرموز، يمكنك سادة وسلسلة عدة قيم المنظم معا.

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