【问题标题】:python intelligent hexadecimal numbers generatorpython智能十六进制数生成器
【发布时间】:2018-07-13 15:59:00
【问题描述】:

我希望能够生成 12 个字符的长链,十六进制,但链中重复的相同数字不超过 2 个:00 而不是 000 因为,我知道如何生成所有可能性,包括 00000000000 到 FFFFFFFFFFF,但我知道我不会使用所有这些值,并且因为使用所有可能性生成的文件的大小是很多 GB,我想减小大小通过避免无用的生成链。

所以我的目标是获得像 00A300BF8911 而不是像 000300BF8911 这样的结果

你能帮我做吗? 非常感谢!

【问题讨论】:

  • 即使有这个限制,结果仍然会非常多。
  • 是否允许重复,只要它们不是连续的?例如,010101010101?
  • 甚至001002003004?
  • @IgnacioVazquez-Abrams:是的
  • 当您说“生成”时,您的意思是“随机生成一个满足这些要求的可能值”,还是您的意思是“遍历具有这些要求的所有可能值,而不重复”?

标签: python hex rainbowtable


【解决方案1】:

如果您两次选择了相同的选项,请将其从选项中移除以进行一轮:

import random
hex_digits = set('0123456789ABCDEF')

result = ""
pick_from = hex_digits
for digit in range(12):
    cur_digit = random.sample(hex_digits, 1)[0]
    result += cur_digit
    if result[-1] == cur_digit:
        pick_from = hex_digits - set(cur_digit)
    else:
        pick_from = hex_digits

print(result)

因为标题提到了生成器。这是上面的生成器:

import random
hex_digits = set('0123456789ABCDEF')

def hexGen():
    while True:
        result = ""
        pick_from = hex_digits
        for digit in range(12):
            cur_digit = random.sample(hex_digits, 1)[0]
            result += cur_digit
            if result[-1] == cur_digit:
                pick_from = hex_digits - set(cur_digit)
            else:
                pick_from = hex_digits
        yield result

my_hex_gen = hexGen()
counter = 0

for result in my_hex_gen:
    print(result)
    counter += 1
    if counter > 10:
        break

结果:

1ECC6A83EB14
D0897DE15E81
9C3E9028B0DE
CE74A2674AF0
9ECBD32C003D
0DF2E5DAC0FB
31C48E691C96
F33AAC2C2052
CD4CEDADD54D
40A329FF6E25
5F5D71F823A4 

您还可以将 while true 循环更改为仅根据传递给函数的数字生成一定数量的这些。

【讨论】:

  • 似乎不起作用,我得到:回溯(最近一次通话最后一次):文件“try.py”,第 10 行,在 last_digit = cur_digit NameError: name 'cur_digit' is not defined
  • 我从最近的编辑中删除了last_digit = ,因为它不需要(result[-1] 有最后一位)
【解决方案2】:

我将这个问题解释为,“我想通过遍历所有具有以下特性的字符串来构造一个彩虹表。字符串的长度为 12,仅包含字符 0-9 和 A-F,它从来没有同一字符连续出现 3 次。”

def iter_all_strings_without_triplicates(size, last_two_digits = (None, None)):
    a,b = last_two_digits
    if size == 0:
        yield ""
    else:
        for c in "0123456789ABCDEF":
            if a == b == c:
                continue
            else:
                for rest in iter_all_strings_without_triplicates(size-1, (b,c)):
                    yield c + rest

for s in iter_all_strings_without_triplicates(12):
    print(s)

结果:

001001001001
001001001002
001001001003
001001001004
001001001005
001001001006
001001001007
001001001008
001001001009
00100100100A
00100100100B
00100100100C
00100100100D
00100100100E
00100100100F
001001001010
001001001011
...

请注意,将输出数百 TB 的值,因此与仅保存每个字符串(无论是否一式三份)相比,您并没有节省太多空间。

【讨论】:

    【解决方案3】:
    import string, random
    
    source = string.hexdigits[:16]
    result = ''
    while len(result) < 12 :
        idx = random.randint(0,len(source))
        if len(result) < 3 or result[-1] != result[-2] or result[-1] != source[idx] :
            result += source[idx]
    

    【讨论】:

    • 但是如果每个十六进制数字只有 2 个,那么您将如何获得所需的输出 00A300BF8911,它有四个零?
    • @Kevin 你说:“不超过 2 个相同的数字在链中重复”??
    • 我没有这么说,但我将其解释为“连续不超过两个相同的数字”。否则,要求与规定的预期输出相矛盾。
    • 是的,4个零不是问题,只要它们不是连续的
    • @lenik :谢谢回答,但是当我执行您的 scipt 时,它在我的计算机上没有任何作用。我做了“python ,没有输出:(有什么遗漏吗?
    【解决方案4】:

    您可以从一个包含两次每个十六进制数字的列表中提取一个随机序列:

    digits = list('1234567890ABCDEF') * 2
    random.shuffle(digits)
    hex_number = ''.join(digits[:12])
    

    如果你想允许更短的序列,你也可以随机化,然后用零填充空白。

    import random
    
    digits = list('1234567890ABCDEF') * 2
    random.shuffle(digits)
    num_digits = random.randrange(3, 13)
    hex_number = ''.join(['0'] * (12-num_digits)) + ''.join(digits[:num_digits])
    
    print(hex_number)
    

    【讨论】:

    • 但是如果每个十六进制数字只有 2 个,那么您将如何获得所需的输出 00A300BF8911,它有四个零?
    • 但我希望像000000123456 这样的数字是非法的,即使所有的零都来自左填充。如果我的解释是正确的,我希望还应该有一个额外的步骤来过滤掉这些结果。
    • 就目前而言,问题可能未得到定义。
    【解决方案5】:

    您可以使用生成器在当前实现产生的字符串上迭代一个窗口。某事。像(hex_str[i:i + 3] for i in range(len(hex_str) - window_size + 1)) 使用lenset 你可以计算切片中不同字符的数量。尽管在您的示例中,仅比较所有 3 个字符可能更容易。

    【讨论】:

      【解决方案6】:

      您可以创建一个从 0 到 255 的数组,并将 random.sample 与您的列表一起使用以获取您的列表

      【讨论】:

      • 好的,那么他如何确保没有三连跑?
      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2012-12-09
      • 2011-11-17
      • 2017-04-01
      • 2013-01-18
      相关资源
      最近更新 更多