Question

En utilisant le langage python, ce serait une façon intelligente / efficace de générer des codes de promotion. Comme à utiliser pour générer des numéros spéciaux pour des coupons de réduction. comme: 1027828-1

Merci

Était-ce utile?

La solution

1027828-1 est extrêmement faible. Un attaquant peut faire un ~ millions en utilisant seulement des suppositions quelques lignes de code et peut-être quelques jours.

Ceci est une bonne façon de produire un difficile à prévoir numéro en utilisant python, il fonctionne sous Linux et Windows. Il est base64'ed pour la sécurité binaire, selon ce que vous faites avec lui, vous voudrez peut-être urllib.urlencode () mais je voudrais éviter Base10 parce qu'il ne stocke pas autant d'informations.

import os
import base64

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

print(secure_rand())

Comme une note de côté ce génère un octet complet, ce qui est base256. 256 ^ 8 est 18446744073709551616 qui devrait être assez grand.

Comme il a été souligné base64 est pas un très bon jeton pour l'homme à utiliser. Considérons un codage alternatif comme base64 url-safe ou peut-être humanhash car ils seraient plus faciles à saisir.

Autres conseils

Ce qui suit est pas particulièrement pythonique ou particulièrement efficace, mais il pourrait suffire:

 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

si vous avez besoin d'un #, vous pouvez le faire 6 chiffres jusqu'à ce que vous avez trouvé une valeur unique:

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

ou aller en séquence ...

Je suis venu avec une réponse à ce que je pense est assez intelligent, mais repose sur deux hypothèses qui pourraient ne pas être vrai pour votre situation.

  • Le code résultant est purement numérique.
  • Le code résultant est techniquement à longueur variable; [10, 20].

Si ces travaux pour vous, alors si cette solution pourrait:

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]

Dans cette fonction, une graine typé chaîne est utilisé comme la base du code. Pour chaque caractère de la chaîne, le convertir en sa représentation ASCII, ajoutez ensuite au code.

Par défaut, la fonction donne des codes comme celui-ci: '97534957569756524557', et peut être appelé avec toute semence arbitraire. Par exemple ...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top