質問

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

ありがとう

役に立ちましたか?

解決

1027828から1は極めて小さいです。攻撃者は、コードの唯一の数行と、おそらく数日を使用して〜百万推測を行うことができます。

これは、LinuxとWindowsで動作、Pythonの使用数を予測することは困難を生成するための良い方法です。それはあなたが()urllib.urlencodeにしたいかもしれないが、それは多くの情報として格納されませんので、私はbase10を避けるためだろうか、あなたがそれをやっているによっては、バイナリの安全のためにbase64'edされます。

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を指摘したとおり、

は、使用する人のための非常に良いトークンではありません。彼らはで入力する方が簡単なように humanhash におそらくURLセーフのBase64でエンコードなどの代替を考えてみましょうか。

他のヒント

以下は、特にニシキヘビや特に効率的ではありませんが、それは十分かもしれません。

 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

あなたは6桁の番号が必要な場合が見つかるまでは、一意の値をこの操作を行うことができます:

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

または連続して行く...

私はこれに対してかなり賢い答えを考え出しましたが、あなたの状況には当てはまらない可能性のあるいくつかの仮定に基づいています。

  • 結果のコードは純粋に数値です。
  • 結果として得られるコードは技術的には可変長です。[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'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top