Pregunta

Al utilizar el lenguaje Python, cuál sería una forma inteligente y eficiente de generar códigos de promoción.Me gusta usarlo para generar números especiales para cupones de descuento.como:1027828-1

Gracias

¿Fue útil?

Solución

1027828-1 es extremadamente pequeño.Un atacante puede hacer aproximadamente un millón de conjeturas utilizando sólo un par de líneas de código y tal vez unos pocos días.

Esta es una buena manera de producir un número difícil de predecir usando Python, funciona en Linux y Windows.Está basado en base64 para seguridad binaria, dependiendo de lo que esté haciendo con él, es posible que desee urllib.urlencode() pero evitaría base10 porque no almacena tanta información.

import os
import base64

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

print(secure_rand())

Como nota al margen, esto genera un byte completo, que es base256.256^8 es 18446744073709551616 que debería ser lo suficientemente grande.

Como se señaló, base64 no es un token muy bueno para que lo utilicen los humanos.Considere una codificación alternativa como base64 segura para URL o quizás humanohash ya que serían más fáciles de escribir.

Otros consejos

La siguiente no es particularmente Pythonic o particularmente eficiente, pero puede ser suficiente:

 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 usted necesita un 6 dígitos # que podría hacer esto hasta que encontró un valor único:

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

o ir secuencialmente ...

Yo he llegado con una respuesta para esto que creo que es bastante inteligente, pero se basa en un par de supuestos que podrían no ser cierto para su situación.

  • El código resultante es puramente numérico.
  • El código resultante es técnicamente de longitud variable; [10, 20].

Si éstos trabajan para usted, a continuación, por lo que podría esta solución:

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]

En esta función, una semilla string-tecleado se utiliza como la base del código. Para cada carácter de la cadena, convertirlo en su representación ASCII y luego añadirlo al código.

Por defecto, la función produce códigos como esto: '97534957569756524557', y puede ser invocado con cualquier semilla arbitraria. Por ejemplo ...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top