In this post, I shall reveal an algorithm that generates all possible combinations of a given set of characters of a specified range of lengths. The algorithm is as follows:
1. take dict as a character array of possible characters in your string combinations take currLen as integer, startLen as integer, stopLen as integer, chars as character array, indices as integer array 2. initialize currLen = startLen 3. Set length of chars array to currLen, length of indices array to currLen 4. set working_index = currLen - 1 5. get string from chars array as follows i. set i'th element of chars array to indices[i]'th element of dict ii. Do the operation in the previous step (i) from i = 0 to i = currLen - 1 iii. concatenate the elements of chars array to generate a string combination of characters 6. print string in step 5 7. if all elements of indices equal length of dict - 1 if currLen < stopLen increment currLen by 1 go to step 3 else quit 8. if element of indices at position = working_index < length of dict - 1 increment element of indices at position = working_index by 1 go to Step 5 else if currLen > 1 decrement working_index by 1 till element of indices at position = working_index equals length of dict - 1 if working_index equals -1 if currLen < stopLen increment currLen by 1 go to Step 3 else quit else increment element of indices at position = working_index by 1 set all elements of indices to the right of position = working_index to 0 go to Step 4 else if currLen < stopLen increment currLen by 1 go to Step 3 else quit
At first glance, this algorithm may look like a brute force algorithm, but I seriously doubt that it can be used to do naughty things like cracking passwords. Of course, to unleash the full power of this algorithm, one needs to parallelize the code in his implementation of this algorithm. That way we can max out the cpu cores and enjoy a very large number of iterations per second.
It may, however, be used to create a reverse lookup database of one way cryptographic hash functions. But, with the use of salts being common nowadays, such a database of all possible plaintexts and their hashes may not be useful after all.
The best part about this algorithm is that it is non-recursive and so avoids an inordinately large number of function calls and a potential call stack overflow. This is true especially when the dictionary of characters is very large.
So, all in all, this algorithm may be used as a fun academic exercise. Or, perhaps one of you guys may come up with a practical use for this algorithm.