Pergunta

Ao usar a linguagem Python, o que seria uma maneira inteligente / eficiente de gerar códigos de promoção. Gostaria de ser usado para gerar números especiais para cupons de desconto. Como: 1027828-1

Obrigado

Foi útil?

Solução

1027828-1 é extremamente pequeno. Um invasor pode fazer um milhão de suposições usando apenas algumas linhas de código e talvez alguns dias.

Essa é uma boa maneira de produzir um número difícil de prever usando o Python, ele funciona no Linux e no Windows. É base64'ed para segurança binária, dependendo do que você está fazendo com ele, você pode querer urllib.urlencode (), mas eu evitaria a Base10 porque não armazena tanta informação.

import os
import base64

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

print(secure_rand())

Como uma nota lateral, isso está gerando um byte completo, que é base256. 256^8 é 18446744073709551616, o que deve ser grande o suficiente.

Como foi apontado, a base64 não é um token muito bom para os humanos usarem. Considere uma codificação alternativa como a base de URL-seguro64 ou talvez HumanHash como eles seriam mais fáceis de digitar.

Outras dicas

O seguinte não é particularmente pitônico ou particularmente eficiente, mas pode 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

Se você precisar de um # de 6 dígitos, poderá fazer isso até encontrar um valor exclusivo:

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

ou vá sequencialmente ...

Eu encontrei uma resposta para isso que acho bastante inteligente, mas depende de algumas suposições que podem não ser verdadeiras para sua situação.

  • O código resultante é puramente numérico.
  • O código resultante é tecnicamente de comprimento variável; [10, 20].

Se eles funcionarem para você, então essa solução também pode:

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]

Nesta função, uma semente de string é usada como base do código. Para cada caractere na string, converta -a em sua representação ASCII e depois anexe -a ao código.

Por padrão, a função gera códigos como este: '97534957569756524557', e pode ser invocado com qualquer semente arbitrária. Por exemplo...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top