4

Python 言語を使用することで、プロモーション コードを生成する賢い/効率的な方法は何でしょうか。割引クーポンの特別な番号を生成するために使用されます。のように: 1027828-1

ありがとう

4

5 に答える 5

8

以下は特に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
于 2010-01-21T20:34:55.857 に答える
5

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などの別のエンコーディングを検討してください。

于 2010-01-21T20:16:16.867 に答える
1

6 桁の # が必要な場合は、一意の値が見つかるまでこれを行うことができます。

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

または順番に...

于 2010-01-21T20:15:37.740 に答える
0

私はかなり賢いと思うこれに対する答えを思いつきましたが、あなたの状況には当てはまらないかもしれないいくつかの仮定に依存しています.

  • 結果のコードは純粋に数値です。
  • 結果のコードは技術的に可変長です。[10、20]。

これらがうまくいく場合は、次の解決策も考えられます。

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'
于 2014-12-11T15:39:37.073 に答える