pythonhexrainbowtable

python intelligent hexadecimal numbers generator


I want to be able to generate 12 character long chain, of hexadecimal, BUT with no more than 2 identical numbers duplicate in the chain: 00 and not 000 Because, I know how to generate ALL possibilites, including 00000000000 to FFFFFFFFFFF, but I know that I won't use all those values, and because the size of the file generated with ALL possibilities is many GB long, I want to reduce the size by avoiding the not useful generated chains.

So my goal is to have results like 00A300BF8911 and not like 000300BF8911

Could you please help me to do so? Many thanks in advance!


Solution

  • if you picked the same one twice, remove it from the choices for a round:

    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)
    

    Since the title mentions generators. Here's the above as a generator:

    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
    

    Results:

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

    You could also change the while true loop to only produce a certain number of these based on a number passed into the function.