、なぜ単にこのような固定長のテンプレートベースのfuzzer書いていない。だから、
# Input(template):
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'}
# Output(fuzz):
{'kc': '6HZ', 'kb': 'zoD', 'ka': '5>b'}
{'kc': '%<\r', 'kb': 'g>v', 'ka': 'Mo0'}
{'kc': 'Y $', 'kb': '4z.', 'ka': '0".'}
{'kc': '^M.', 'kb': 'QY1', 'ka': 'P0)'}
{'kc': 'FK4', 'kb': 'oZW', 'ka': 'G1q'}
:それはこれをもたらす可能性があるユースケースの入力時に
#! /usr/bin/env python
"""Minimal template based dict string value fuzzer."""
from __future__ import print_function
import random
import string
def random_string(rng, length, chars=string.printable):
"""A random string with given length."""
return ''.join(rng.choice(chars) for _ in range(length))
def dict_string_template_fuzz_gen(rng, dict_in):
"""Given a random number generator rng, and starting from
template dict_in expected to have only strings as values,
this generator function yields derived dicts with random
variations in the string values keeping the length of
those identical."""
while True:
yield dict((k, random_string(rng, len(v))) for k, v in dict_in.items())
def main():
"""Drive a test run of minimal template fuzz."""
k1, k2, k3 = 'ka', 'kb', 'kc'
template = {k1: "aaa", k2: "bbb", k3: "ccc"}
print("# Input(template):")
print(template)
rng = random.SystemRandom()
print("# Output(fuzz):")
for n, fuzz in enumerate(dict_string_template_fuzz_gen(rng,
template), start=0):
print(fuzz)
if n > 3:
break
if __name__ == '__main__':
main()
をこれは、Pythonの知識が始まっているブートストラッピングの問題かもしれないので、OPを何か開始するべきです...
私はちょうどPEP8に準拠していますが、それはPython v2またはv3でも問題ありません。
ライブラリやいくつかの単純なエンハンスドコーディングで十分である場合は、多くのオープンエンドで評価してもらう必要があります。 OPだけが知っているでしょうが、この回答提案にコメントしたり、質問を更新したりできます。
ヒント:ほとんどの場合、SystemRandomを使用してより堅牢に並列化することができます。より高速な方法があるかもしれませんが、仕様ではパフォーマンスは私には見えませんでした。これは最高の教育であるので、印刷物は当然スパンコールされている。 HTH
更新: いくつかの類似性を維持するために、文字列の一部だけを変更するOPのコメントを読んだ、一つは例えばによってfuzzer機能の上に交換可能性:その後、
def dict_string_template_fuzz_len_gen(rng, dict_in, f_len=1):
"""Given a random number generator rng, and starting from
template dict_in expected to have only strings as values,
this generator function yields derived dicts with random
variations in the string values keeping the length of
those identical.
Added as hack the f_len parameter that counts the
characters open to be fuzzed from the end of the string."""
r_s = random_string # shorten for line readability below
while True:
yield dict(
(k, v[:f_len + 1] + r_s(rng, f_len)) for k, v in dict_in.items())
とサンプル出力として持つ:
# Input(template):
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'}
# Output(fuzz):
{'kc': 'cc\t', 'kb': 'bbd', 'ka': 'aa\\'}
{'kc': 'cc&', 'kb': 'bbt', 'ka': 'aa\\'}
{'kc': 'ccg', 'kb': 'bb_', 'ka': 'aaJ'}
{'kc': 'ccc', 'kb': 'bbv', 'ka': 'aau'}
{'kc': 'ccw', 'kb': 'bbs', 'ka': "aa'"}
この機能の代わりに、他を呼び出すとき。
辞書のサイズは何ですか?「いくつかの値」はどういう意味ですか?なぜ値の一部をランダムに変更しないのですか? –
ツール/ライブラリへのリクエストは、明らかにトピック外であることに注意してください。 – jonrsharpe
この簡単なタスクを達成するためにコードを完成させるためのヘルプをリクエストするのは大抵ここで歓迎されます;-)それはあなたがいくつかのコードをスケッチし、そして、@AbdulFatirが提案する/尋ねるように:いくつかの理由はありますか?サンプルでは、値の文字列の3番目の文字列が変更され、排他的にしか使われないのはなぜですか? – Dilettant