Domanda

Utilizzando il linguaggio Python, che cosa sarebbe un modo intelligente / efficace di generare codici promozionali. Come per essere utilizzato per la generazione di numeri speciali per i buoni sconto. come: 1.027.828-1

Grazie

È stato utile?

Soluzione

1.027.828-1 è estremamente piccola. Un utente malintenzionato può fare una ~ milione di congetture che utilizzano solo un paio di righe di codice e forse un paio di giorni.

Questo è un buon modo per produrre un difficile prevedere il numero utilizzando python, funziona sotto Linux e Windows. E 'base64'ed per la sicurezza binario, a seconda che cosa si sta facendo con esso si potrebbe desiderare di urllib.urlencode (), ma vorrei evitare Base10 perché non memorizza tutte le informazioni.

import os
import base64

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

print(secure_rand())

Come nota questo genera un byte completo, che è base256. 256 ^ 8 è 18446744073709551616 che dovrebbe essere abbastanza grande.

Come è stato sottolineato Base64 non è un buon segno per gli esseri umani da usare. Prendere in considerazione una codifica Base64 alternativo come sicuro per le URL o forse humanhash come sarebbero più facili da digitare.

Altri suggerimenti

Di seguito non è particolarmente pythonic o particolarmente efficiente, ma potrebbe essere sufficiente:

 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 avete bisogno di un 6 cifre # si potrebbe fare questo fino a quando hai trovato un valore unico:

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

o andare in sequenza ...

I è venuta in mente una risposta per questo che penso sia abbastanza intelligente, ma si basa su un paio di ipotesi che potrebbero non essere vero per la situazione.

  • Il codice risultante è puramente numerico.
  • Il codice risultante è tecnicamente lunghezza variabile; [10, 20].

Se questi lavoro per voi, allora così potrebbe questa soluzione:

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 questa funzione, un seme stringa digitato viene utilizzato come base del codice. Per ogni carattere della stringa, convertirla nella sua rappresentazione ASCII, quindi aggiungere al codice.

Per default, la funzione produce codici simili: '97534957569756524557', e può essere richiamato con qualsiasi seme arbitrario. Per esempio ...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top