Question

I was hoping someone with better math capabilities would assist me in figuring out the total possibilities for a string given it's length and character set.

i.e. [a-f0-9]{6}

What are the possibilities for this pattern of random characters?

Was it helpful?

Solution

It is equal to the number of characters in the set raised to 6th power. In Python (3.x) interpreter:

>>> len("0123456789abcdef")
16
>>> 16**6
16777216
>>>

EDIT 1: Why 16.7 million? Well, 000000 ... 999999 = 10^6 = 1M, 16/10 = 1.6 and

>>> 1.6**6
16.77721600000000 

* EDIT 2:* To create a list in Python, do: print(['{0:06x}'.format(i) for i in range(16**6)]) However, this is too huge. Here is a simpler, shorter example:

>>> ['{0:06x}'.format(i) for i in range(100)]
['000000', '000001', '000002', '000003', '000004', '000005', '000006', '000007', '000008', '000009', '00000a', '00000b', '00000c', '00000d', '00000e', '00000f', '000010', '000011', '000012', '000013', '000014', '000015', '000016', '000017', '000018', '000019', '00001a', '00001b', '00001c', '00001d', '00001e', '00001f', '000020', '000021', '000022', '000023', '000024', '000025', '000026', '000027', '000028', '000029', '00002a', '00002b', '00002c', '00002d', '00002e', '00002f', '000030', '000031', '000032', '000033', '000034', '000035', '000036', '000037', '000038', '000039', '00003a', '00003b', '00003c', '00003d', '00003e', '00003f', '000040', '000041', '000042', '000043', '000044', '000045', '000046', '000047', '000048', '000049', '00004a', '00004b', '00004c', '00004d', '00004e', '00004f', '000050', '000051', '000052', '000053', '000054', '000055', '000056', '000057', '000058', '000059', '00005a', '00005b', '00005c', '00005d', '00005e', '00005f', '000060', '000061', '000062', '000063']
>>> 

EDIT 3: As a function:

def generateAllHex(numDigits):
    assert(numDigits > 0)
    ceiling = 16**numDigits
    for i in range(ceiling):
        formatStr = '{0:0' + str(numDigits) + 'x}'
        print(formatStr.format(i))

This will take a while to print at numDigits = 6. I recommend dumping this to file instead like so:

def generateAllHex(numDigits, fileName):
    assert(numDigits > 0)
    ceiling = 16**numDigits
    with open(fileName, 'w') as fout:
        for i in range(ceiling):
            formatStr = '{0:0' + str(numDigits) + 'x}'
            fout.write(formatStr.format(i))

OTHER TIPS

If you are just looking for the number of possibilities, the answer is (charset.length)^(length). If you need to actually generate a list of the possibilities, just loop through each character, recursively generating the remainder of the string.

e.g.

void generate(char[] charset, int length)
{
  generate("",charset,length);
}

void generate(String prefix, char[] charset, int length)
{
  for(int i=0;i<charset.length;i++)
  {
    if(length==1)
      System.out.println(prefix + charset[i]);
    else
      generate(prefix+i,charset,length-1);
  }
}

The number of possibilities is the size of your alphabet, to the power of the size of your string (in the general case, of course)

assuming your string size is 4: _ _ _ _ and your alphabet = { 0 , 1 }: there are 2 possibilities to put 0 or 1 in the first place, second place and so on. so it all sums up to: alphabet_size^String_size

first: 000000 last: ffffff

This matches hexadecimal numbers.

For any given set of possible values, the number of permutations is the number of possibilities raised to the power of the number of items.

In this case, that would be 16 to the 6th power, or 16777216 possibilities.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top