Python 言語を使用することで、プロモーション コードを生成する賢い/効率的な方法は何でしょうか。割引クーポンの特別な番号を生成するために使用されます。のように: 1027828-1
ありがとう
Python 言語を使用することで、プロモーション コードを生成する賢い/効率的な方法は何でしょうか。割引クーポンの特別な番号を生成するために使用されます。のように: 1027828-1
ありがとう
以下は特にPythonicでも特に効率的でもありませんが、それで十分かもしれません:
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
1027828-1 は非常に小さいです。攻撃者は、ほんの数行のコードとおそらく数日で、100 万回程度の推測を行うことができます。
これは、Python を使用して予測しにくい数値を生成するための良い方法です。Linux および Windows で動作します。バイナリの安全性のためにbase64化されています.urllib.urlencode()を使用したい場合がありますが、base10はそれほど多くの情報を保存しないため避けます。
import os
import base64
def secure_rand(len=8):
token=os.urandom(len)
return base64.b64encode(token)
print(secure_rand())
補足として、これはbase256であるフルバイトを生成しています。256^8 は 18446744073709551616 で十分な大きさです。
指摘されたように、base64 は人間が使用するのにあまり適したトークンではありません。入力しやすいように、url-safe base64 やhumanhashなどの別のエンコーディングを検討してください。
6 桁の # が必要な場合は、一意の値が見つかるまでこれを行うことができます。
import random
print str(random.randint(100000, 999999))
または順番に...
私はかなり賢いと思うこれに対する答えを思いつきましたが、あなたの状況には当てはまらないかもしれないいくつかの仮定に依存しています.
これらがうまくいく場合は、次の解決策も考えられます。
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]
この関数では、文字列型のシードがコードのベースとして使用されます。文字列内の各文字を ASCII 表現に変換してから、コードに追加します。
デフォルトでは、関数は次のようなコードを生成'97534957569756524557'
し、任意のシードで呼び出すことができます。例えば...
code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'