ما هي الخيارات لتوليد المستخدم ودية ألفا رقمية معرفات (مثل الأعمال معرف الكود)

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

  •  03-07-2019
  •  | 
  •  

سؤال

هنا متطلبات:

يجب أن تكون أبجدية ، 8-10 الشخصيات بحيث يكون المستخدم ودية.هذه سيتم تخزين مفاتيح فريدة من نوعها في قاعدة البيانات الخاصة بنا.أنا باستخدام Guid كما المفاتيح الأساسية لذلك خيار استخدام المعرفات الفريدة العمومية لتوليد هذه معرفات فريدة سيكون الأفضل.

وأنا أفكر على غرار قاعدة-n محول يأخذ Guid و يحول إلى 8 أحرف فريدة من نوعها السلسلة.

قصيرة وخفيفة الوزن خوارزمية المفضل كما يسمى في كثير من الأحيان.

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

المحلول

وكنت قد تنظر قاعدة 36. في أنه يمكن القيام به الحروف والأرقام. النظر في رفع I (العين) وO (أوه) من مجموعة الخاصة بك حتى لا تختلط مع 1 (واحد) و 0 (صفر). بعض الناس قد يشكو 2 و Z أيضا.

نصائح أخرى

8 characters - perfectly random - 36^8 = 2,821,109,907,456 combinations
10 characters - perfectly random - 36^10 = 3,656,158,440,062,976 combinations
GUID's - statistically unique* - 2^128 = 340,000,000,000,000,000,000,000,000,000,000,000,000 combinations

* هو GUID فريدة من نوعها 100 ٪ من الوقت ؟ [ستاكوفيرفلوو]

المشكلة مع GUID -> حرف التحويل ؛ بينما GUID إحصائيا فريدة من نوعها ، قبل اتخاذ أي مجموعة فرعية يمكنك تقليل العشوائية و زيادة فرصة التصادم.أنت بالتأكيد لا ترغب في إنشاء غير أونقيوي الكود هو.


الحل 1:

إنشاء الكود باستخدام البيانات ذات الصلة بموضوع قواعد العمل.

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

نظريا:

Wholesaler, product name, product version, sku
Amazon,     IPod Nano,    2.2,             AMIPDNN22
BestBuy,    Vaio,         3.2,             BEVAIO32

الحل 2:

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

التنفيذ هو أن يكون key الجدول في قاعدة بيانات على العداد.العداد يتزايد في الصفقة.نقطة مهمة هي أنه بدلا من تزايد بنسبة 1 ، طريقة في برنامج الاستيلاء على كتلة.الزائفة c#رمز على النحو التالي.

-- what the key table may look like
CREATE TABLE Keys(Name VARCHAR(10) primary key, NextID INT)
INSERT INTO Keys Values('sku',1)

// some elements of the class
public static SkuKeyGenerator 
{
    private static syncObject = new object();
    private static int nextID = 0;
    private static int maxID = 0;
    private const int amountToReserve = 100;

    public static int NextKey()
    {
        lock( syncObject )
        {
            if( nextID == maxID )
            {
                ReserveIds();
            }
            return nextID++;
        }
    }
    private static void ReserveIds()
    {
        // pseudocode - in reality I'd do this with a stored procedure inside a transaction,
        // We reserve some predefined number of keys from Keys where Name = 'sku'
        // need to run the select and update in the same transaction because this isn't the only
        // method that can use this table.
        using( Transaction trans = new Transaction() ) // pseudocode.
        {
             int currentTableValue = db.Execute(trans, "SELECT NextID FROM Keys WHERE Name = 'sku'");
             int newMaxID = currentTableValue + amountToReserve;
             db.Execute(trans, "UPDATE Keys SET NextID = @1 WHERE Name = 'sku'", newMaxID);

             trans.Commit();

             nextID = currentTableValue;
             maxID = newMaxID;
        }
    } 

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

لأن هذا ويعتمد تنفيذ قاعدة بيانات المعاملات يمكن أن يكون لديك التطبيقات قيد التشغيل في وقت واحد ومن جميع توليد مفاتيح فريدة من نوعها من دون الحاجة إلى الذهاب إلى قاعدة البيانات في كثير من الأحيان.

ملاحظة أعلاه مبني على key table, صفحة 222 من أنماط من تطبيق المشاريع المعمارية (فاولر).هذه الطريقة عادة ما تستخدم لتوليد المفاتيح الأساسية دون الحاجة إلى وجود قاعدة بيانات عمود الهوية ، ولكن يمكنك أن ترى كيف يمكن تكييفها لهذا الغرض الخاص.

إذا كنت تبحث عن "سهل الاستخدام" قد ترغب في محاولة استخدام كلمات كاملة بدلا من مجرد جعلها قصيرة / alphanumberic، وبالتالي، شيئا مثل:

words = [s.strip().lower() for s in open('/usr/share/dict/canadian-english') if "'" not in s]
mod = len(words)

def main(script, guid):
    guid = hash(guid)

    print "+".join(words[(guid ** e) % mod] for e in (53, 61, 71))

if __name__ == "__main__":
    import sys
    main(*sys.argv)

والتي تنتج الانتاج مثل:

oranjestad+compressing+wellspring
padlock+discommoded+blazons
pt+olenek+renews

ما هي مسلية. خلاف ذلك، مجرد اتخاذ الأحرف الأولى من 8-10 ارشد أو التجزئة SHA1 / MD5 من الإحساس. وربما أفضل رهان.

وأبسط شيء يمكن ان العمل هو التصدي لذلك يتزايد في كل مرة لا بد من القيمة. ثمانية أرقام (يسار-صفر مبطن) تمنحك 100 مليون القيم الممكنة 00000000-99999999 (على الرغم من أنك قد تقحم مسافات أو الواصلات لهذين الإنسان، كما هو الحال في 000-000-00).

إذا سيحتاج إلى أكثر من 100 مليون القيم، التي إما أن تزيد من طول أو استخدام الحروف في مواقف بديلة. باستخدام A0A0A0A0 من خلال Z9Z9Z9Z9 يمنحك أكثر من أربع سنوات ونصف مليار القيم الممكنة (4569760000) المتاحة. أنها قليلا تافهة من التعليمات البرمجية إلى اتخاذ عدد صحيح طويل وإنتاج مثل هذا الترميز (وزارة الدفاع 10 للأرقام أقصى اليمين، شعبة بنسبة 10 ثم وزارة الدفاع 26 لأقصى اليمين الرسالة، وما إلى ذلك) إذا كان لديك ذاكرة لحرق، أسرع وسيلة هو تحويل العداد إلى وزارة الدفاع 260 مجموعة، واستخدام كل وزارة الدفاع قيمة 260 وذلك في مؤشر إلى مجموعة من سلاسل من حرفين ( "A0"، "A1"، "A2"، وهلم جرا من خلال "A9"، " B0 "،" B1 "، وما إلى ذلك من خلال" Z9 ").

والمشكلة مع قاعدة 36 (المذكورة في الرد آخر) هو أنك لا داعي للقلق حول القارئ الخلط بين شخصيات مماثلة (مقابل واحد وصفر مقابل O، اثنان مقابل Z، خمسة مقابل S) ولكن أيضا عن مجموعة من الحروف المجاورة التي يمكن أن ينظر إليها من قبل القراء كما هجاء الكلمات أو الاختصارات كريه أو فاحشة.

وأنت قد ترغب في محاولة لتجزئة خوارزمية CRC32. وCRC32 يولد سلسلة من 8 أرقام.

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

http://textop.us/Hashing/CRC

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