Andre
Andre

Reputation: 1385

Determining All Possibilities for a Random String?

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?

Upvotes: 1

Views: 1864

Answers (5)

Hamish Grubijan
Hamish Grubijan

Reputation: 10820

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))

Upvotes: 10

Protostome
Protostome

Reputation: 6019

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

Upvotes: 2

Jacob Mattison
Jacob Mattison

Reputation: 51062

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.

Upvotes: 1

VeeArr
VeeArr

Reputation: 6178

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);
  }
}

Upvotes: 2

mcandre
mcandre

Reputation: 24612

first: 000000 last: ffffff

This matches hexadecimal numbers.

Upvotes: 1

Related Questions