سؤال

باستخدام لغة Python ، ما الذي يمكن أن يكون وسيلة ذكية / فعالة لتوليد رموز الترويج. مثل أن تستخدم لإنشاء أرقام خاصة لكوبونات الخصم. مثل: 1027828-1

شكرًا

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

المحلول

1027828-1 صغير للغاية. يمكن للمهاجم أن يصنع تخمينات ~ مليون شخص فقط باستخدام خطين من الكود وربما بضعة أيام.

هذه طريقة جيدة لإنتاج رقم صعب للتنبؤ باستخدام Python ، وهو يعمل تحت Linux و Windows. إنه أساسي 64 من السلامة الثنائية ، اعتمادًا على ما تفعله به قد ترغب في urllib.urlencode () لكنني سأتجنب BASE10 لأنه لا يخزن الكثير من المعلومات.

import os
import base64

def secure_rand(len=8):
    token=os.urandom(len)
    return base64.b64encode(token)

print(secure_rand())

كملاحظة جانبية ، هذا يولد بايت كامل ، وهو BASE256. 256^8 هو 18446744073709551616 الذي يجب أن يكون كبيرًا بدرجة كافية.

كما تم الإشارة إلى أن Base64 ليس رمزًا جيدًا جدًا للبشر لاستخدامه. النظر في ترميز بديل مثل قاعدة url-safe64 أو ربما Humanhash كما سيكون أسهل في الكتابة.

نصائح أخرى

ما يلي ليسان بشكل خاص أو فعال بشكل خاص ، لكنه قد يكفي:

 import random
 def get_promo_code(num_chars):
     code_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     code = ''
     for i in range(0, num_chars):
         slice_start = random.randint(0, len(code_chars) - 1)
         code += code_chars[slice_start: slice_start + 1]
     return code

إذا كنت بحاجة إلى 6 أرقام # يمكنك القيام بذلك حتى تجد قيمة فريدة:

import random
print str(random.randint(100000, 999999))

أو اذهب بالتتابع ...

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

  • الكود الناتج هو رقمي بحت.
  • الكود الناتج هو طول متغير تقنيا. [10 ، 20].

إذا كانت هذه تعمل من أجلك ، فربما هذا الحل:

def code(seed = None):
    if (not seed) or (type(seed) != str) or (len(seed) < 10):
        seed = str(uuid.uuid4())[:10]

    code = ""
    for character in seed:
        value = str(ord(character))
        code += value

    return code[:20]

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

بشكل افتراضي ، تعطي الوظيفة رموز مثل هذا: '97534957569756524557', ، ويمكن التذرع بها مع أي بذرة تعسفية. علي سبيل المثال...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top