Генерация случайного имени файла с помощью while ()? - PullRequest
0 голосов
/ 14 сентября 2011

Я использую цикл while(), чтобы создать случайное имя файла, сравнить его с базой данных, а затем, если оно уже существует, выполнить цикл.Я просто немного обеспокоен тем, что мой синтаксис / использование отключены, поскольку я делал это только один раз давным-давно, и с тех пор не использовал цикл while() таким образом.

Вот мой код:

$i = 0;
while(++$i) {
    $file_name = md5(mt_rand(0,9999999)) . ".php";
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'");

    if(mysql_num_rows($result) == 0) { break; } else { continue;}
}

Будет ли это работать, и если нет, то что с ним не так?

Я знаю, что это мелкий вопрос, но проверяю, действительно ли этосработает, кажется, намного более «сложно» (нужно создать новую таблицу, изменить имя файла, выбрать одну из трех вещей, отобразить сообщение вместо продолжения и т. д.)

Любая помощь, как всегда, будетцениться!

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

Вам не нужно $i, так как вы не используете его, и вам не нужно continue в цикле - цикл автоматически зациклится, вот что он делает.Вам нужно только break, когда вы достигнете условия, при котором вы хотите завершить цикл:

while(true) {
    $file_name = md5(mt_rand(0,9999999)) . ".php";
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'");

    if (mysql_num_rows($result) == 0) break;
}

Хотя вы используете хэши в слегка нарушенном виде.Вы должны генерировать случайную строку длиннее , чем хеш MD5, не короче.Прямо сейчас у вас есть только 10 000 000 возможных имен файлов (0..99999999) вместо целых 2 ^ 128, которые может создать MD5.Вместо того, чтобы беспокоиться о коллизиях хеша в пространстве размером 2 ^ 128, у вас гораздо больше шансов просто сгенерировать одни и те же числа дважды, что приведет к нескольким обращениям к базе данных.

2 голосов
/ 14 сентября 2011

Я знаю, что это мелкий вопрос, но проверка того, сработает ли это, кажется намного более «сложной» (нужно создать новую таблицу, изменить имя файла, выбрать одну из трех вещей, вместо этого отобразить сообщение продолжить и т. д.

Использование подхода, который используется в коде, также более «трудоемко», чем необходимо. Это работоспособно, но почему бы не позволить базе данных сделать «создание уникального идентификатора файла» для вас?

Определите столбец file_name в x вместо столбца file_id, который равен bigint(20) auto_increment или что-то в этом роде. Затем в коде PHP выполните запрос для создания новой строки, получите уникальный числовой идентификатор с гарантированной уникальностью и преобразуйте его в имя файла.

1 голос
/ 14 сентября 2011

Это будет работать, но вы можете изменить строку: while (++ $ i) на while (true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...