سؤال

أنا أعمل مع عميل يحتاج إلى إنشاء الملايين من الرموز الأبجدية الرقمية المستخدمة في بطاقات مسح المجلات وجوائز الزجاجة وما إلى ذلك.يجب أن تكون قصيرة بما يكفي للطباعة على الغطاء، ويريدون التأكد من أن الأحرف الغامضة مثل 1 وI و0 وO، وما إلى ذلك.لم يتم تضمينها، ويجب تخزينها بشكل واضح لاستخدامها في المستقبل - لا يمكننا فقط أن يكون لدينا خوارزمية تحدد "الصلاحية" عندما يحاول شخص ما استردادها.وأخيرًا، يريدون التأكد من توزيع الرموز بشكل عشوائي داخل "مساحة رموز" كبيرة بحيث لا يتمكن الأشخاص من تخمين رموز إضافية من خلال التنقل بين الحروف الأبجدية.

هل هناك أي مؤشرات نحو خوارزميات فعالة بشكل معقول لإنشاء هذه الأنواع من مجموعات التعليمات البرمجية؟لقد قمت بخدش القليل منها على ظهر الظرف، لكن هذه المشكلة تبدو وكأنها فخ لغير الحذرين.

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

المحلول

إذا كنت بحاجة إلى حوالي 10 ملايين مفتاح فريد (على سبيل المثال)، فإن أفضل طريقة هي اختيار مساحة مفتاح أكبر بشكل كبير، والبدء في الإنشاء بشكل عشوائي.اقرأ عن مفارقة عيد الميلاد - إنه الشيء الرئيسي الذي يجب أن تقلق بشأنه.إذا كنت تريد 2^n مفاتيح فريدة وآمنة، فتأكد من وجود 2^(2 * n) من القيم المحتملة على الأقل.إليك خوارزمية O(n log n) التقريبية:

  • استخدم مساحة رئيسية لا تقل عن 2^50 (وبعبارة أخرى، اسمح بـ 2^50 من القيم الفريدة المحتملة)، ولن يكون لديك أي تصادمات في مجموعة البيانات بأكملها - وأي شخص يفرض عليك مفاتيحك سيكون لديه ما يقرب من احتمالات الحصول على المفتاح إذا حاولوا 2 ^ 25 منهم.
  • توليد العديد من الأرقام العشوائية ما تحتاج إليه
  • قم بفهرسة قاعدة البيانات على مفتاحك (هذه هي خطوة O(n lg n):النوع)
  • الصفحة من خلال قاعدة البيانات والتكرار عبر مجموعة البيانات بأكملها لقص التكرارات (الرمز الكاذب أدناه)
  • احذف الصفوف المكررة، وبذلك تكون قد انتهيت.

كود مزيف:

$last = null;
while ($current = getnext()) {
    if ($last == $current) {
        push($toDelete, $current);
    }
    $last = $current;
}

نصائح أخرى

لنفترض أنه يمكنك استخدام مجموعة أحرف، على سبيل المثال، 40 رمزًا لأحرف علوية وسفلية ورقمية لا لبس فيها.

للحصول على سلسلة من الأحرف n، لديك 40ن مجموعات

  • 404 = 2,560,000
  • 405 = 102,400,000
  • 406 = 4,096,000,000
  • 407 = 163,840,000,000
  • 408 = 6,553,600,000,000

وبالتالي فإن 8 أحرف توفر مساحة جيدة جدًا للعمل فيها - إذا قمت بإنشاء 10 ملايين رمز، فسيتعين عليك تجربة مئات الآلاف من المجموعات لفرض التعليمات البرمجية.

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

بأخذ الرمز المكون من 8 أحرف، فإن 6,553,600,000,000 يساوي 2 تقريبًا42, ، وبالتالي قد تولد بشكل معقول 221 رموز منه، أو 2,097,152

استخدم لمرة واحدة كلمة خوارزمية؟

وتفاصيل RFC4225 واحدة على أساس خوارزمية HMAC.

http://www.ietf.org/rfc/rfc4226.txt

ولكن بدلا من استخدام 0-9 أرقام الترميز base10، استخدم base32.

وWhatver الطريقة التي تستخدمها، أود أن أقترح عليك إضافة رقم الشيك أو اثنين كدفاع "الخط الأول" ضد الشعب سوء دخول أو محاولة لاختراع عدد.

والغريب، مع البذور التالي كنت فقط قادرة على توليد 32 سلاسل فريدة من نوعها.

وABCDEFGHJKLMNPQRSTUVWXYZ23456789

ومع بذرة أطول وكنت قادرا على توليد الكثير - ولدت 40،000 سلاسل فريدة بنجاح

وABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789

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