При условии, что можно использовать только 62 различных символа, для хранения всех возможных 8-символьных паролей требуется 62 ^ 8 = 198 терабайт.
Чтобы ответить на ваш loop вопрос, вот некоторый код для циклического перебора всех возможных паролей данного len, используя символы для данного набора:
int len = 3;
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int nbletters = sizeof(letters)-1;
int main() {
int i, entry[len];
for(i=0 ; i<len ; i++) entry[i] = 0;
do {
for(i=0 ; i<len ; i++) putchar(letters[entry[i]]);
putchar('\n');
for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0;
} while(i<len);
}
Основная часть - последний цикл для . В большинстве случаев он только увеличивает первую запись и останавливается на ней, поскольку эта запись не достигла nbletters. Если запись достигает значения nbletter, это означает, что она должна вернуться к нулю, и это очередь следующей записи, которая должна быть увеличена. Это действительно необычное условие цикла: цикл продолжается до тех пор, пока не произойдет переполнение. Цикл происходит только в худшем случае: когда в последнем элементе несколько записей.
Представьте себе случай, когда текущее слово "zzzc". В свою очередь, каждая запись увеличивается, ее переполнение обнаруживается, оно сбрасывается в 0 и рассматривается следующая запись до последней записи, которая не переполняется, для выдачи «000d».