Frage

Mit dem Python-Sprache, was wäre eine kluge / effiziente Art und Weise Promotion-Codes zu erzeugen. Wie zu zur Erzeugung von Sondernummern für Rabatt-Coupons verwendet werden. wie: 1027828-1

Danke

War es hilfreich?

Lösung

1027828-1 ist extrem klein. Ein Angreifer kann eine ~ Millionen Vermutungen mit nur ein paar Zeilen Code und vielleicht ein paar Tagen.

Dies ist ein guter Weg, um eine schwer vorhersagbar Zahl mit Python zu produzieren, es funktioniert unter Linux und Windows. Es ist für binäre Sicherheit base64'ed, je nachdem, was Sie mit ihm tun Sie urllib.urlencode () wollen könnte, aber ich würde Base10 vermeiden, weil es nicht so viele Informationen speichert.

import os
import base64

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

print(secure_rand())

Als Randnotiz ist dies ein volles Byte zu erzeugen, die base256 ist. 256 ^ 8 ist 18446744073709551616, die groß genug sein sollte.

Wie es wurde base64 weist darauf hin, ist nicht ein sehr gutes Zeichen für die Menschen zu verwenden. Betrachten wir eine alternative Codierung wie URL-safe base64 oder vielleicht humanhash , da sie einfacher wäre, in eingeben.

Andere Tipps

Im Folgenden ist nicht besonders pythonic oder besonders effizient, aber es könnte genügen:

 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

Wenn Sie eine 6-stellige # brauchen Sie dies tun, bis Sie einen eindeutigen Wert gefunden:

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

oder gehen der Reihe nach ...

Ich habe für diese eine Antwort kommen, dass ich denke, ziemlich clever ist, sondern stützt sich auf ein paar Annahmen, die für Ihre Situation könnte nicht wahr sein.

  • Der resultierende Code ist rein numerisch.
  • Der resultierende Code ist technisch mit variabler Länge; [10, 20].

Wenn diese Arbeit für Sie, dann, so könnte diese Lösung:

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]

In dieser Funktion ein String typisierte Samen wird als Basis des Codes verwendet. Für jedes Zeichen in der Zeichenfolge, wandeln sie in seine ASCII-Darstellung, dann an den Code anhängen.

Standardmäßig liefert die Funktionscodes wie folgt aus: '97534957569756524557', und kann mit jedem beliebigen Samen aufgerufen werden. Zum Beispiel ...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top