@antyan_s

Генерация паролей на c++ Не могу понять в чем проблема?

Суть вот в чем. Написал код который генерирует пароли в файлы по заданному количеству. Если устанавливаю количество символо 8 или меньше, код отрабатывает на ура, а вот если 9 и более, то программа завершается быстро и не создает файл с паролями. ОС ubuntu 18

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

const std::string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%-()_+~,.':?=\\/"; // Алфавит символов
const int password_length = 11;
const long long int total_combinations = std::pow(alphabet.length(), password_length);
const int passwords_per_file = 100;

void generate_passwords(const std::string& filename, long long int start_iteration, long long int end_iteration) {
    std::ofstream file(filename);
    if (!file) {
        std::cout << "Не удалось открыть файл " << filename << " для записи паролей." << std::endl;
        return;
    }

    std::string current_password(password_length, alphabet[0]);

    long long int current_iteration = 0;
    while (current_iteration <= end_iteration) {
        if (current_iteration >= start_iteration) {
            file << current_password << '\n';
        }

        // Увеличение пароля на 1
        for (int i = password_length - 1; i >= 0; i--) {
            current_password[i] = alphabet[(alphabet.find(current_password[i]) + 1) % alphabet.length()];

            if (current_password[i] != alphabet[0]) {
                break;
            }
        }

        current_iteration++;
    }

    file.close();
}

int main() {
    long long int start_iteration = 0; // Начальная итерация
    long long int end_iteration = total_combinations - 1; // Конечная итерация

    int num_files = static_cast<int>(std::ceil(static_cast<double>(end_iteration - start_iteration + 1) / passwords_per_file));

    for (int i = 0; i < num_files; i++) {
        long long int start = start_iteration + i * passwords_per_file;
        long long int end = std::min(start_iteration + (i + 1) * passwords_per_file - 1, end_iteration);
        std::string filename = "passwords_" + std::to_string(password_length) + "_" + std::to_string(i) + ".txt";

        generate_passwords(filename, start, end);

        std::cout << "Создан файл " << filename << std::endl;
    }

    std::cout << "Генерация паролей завершена." << std::endl;

    return 0;
}
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
⌈829 / 100⌉ = 1 676 195 504 097 081 > 2 147 483 647 = 231 - 1
То есть, вы получаете переполнение переменной num_files, там оказывается отрицательное значение и цикл не выполняется ни разу. Вообще, переполнение вы получаете уже начиная с 7 символов, но, видимо, там получаются положительные значения.
Дальше, при 10 символах вы получите уже переполнение total_combinations:
8210 = 13 744 803 133 596 058 624 > 9 223 372 036 854 775 807 = 263-1
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Потому что 9 в 77й степени точно не влезет в long long int.

UPD: даже не 77, а больше. Я со счёта сбился пока считал
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
std::pow(alphabet.length(), password_length);

82 в десятой степени -- это 0xbebf59a0_7dab4400, т.е. это число уже не влезает в 64-битный long long int. Вам нужно придумать другой способ считать пароли.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы