la generazione di codice promozionale utilizzando python
-
22-09-2019 - |
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
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'