ЗДРАВСТВУЙ
Каков наилучший способ создать случайное имя для папки?
Он будет использоваться для имени папки для хранения документов. Но будет создано множество папок, поэтому нужно, чтобы это было уникально каждый раз, когда это было возможно.
Длина должна составлять около 7 символов.
Если он должен быть уникальным, я бы забыл, что он случайен и просто увеличивает счетчик. Если вам нужно связать содержимое папок с записями в базе данных, тем лучше. Вы можете просто иметь столбец автоинкремента в своей базе данных и использовать его как часть имени папки.
Вы также можете попробовать uniqid()
PHP с параметром more_entropy
установленным в true.
Или просто sha1(
microtime()
)
Вот функция, которую я использую:
function makeRandomString($max=6) { $i = 0; //Reset the counter. $possible_keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; $keys_length = strlen($possible_keys); $str = ""; //Let's declare the string, to add later. while($i<$max) { $rand = mt_rand(1,$keys_length-1); $str.= $possible_keys[$rand]; $i++; } return $str; }
EDIT: Как сказал Билл Ящерица, вам лучше добавить какой-то счетчик. Хотя очень маловероятно, возможно, что одну и ту же строку можно создать дважды.
Является ли 7-символьное имя папки жестким и быстрым правилом (в чем причина ограничения)?
Я использую YYYYmmDDHHMMSS (и добавляю миллисекунду, если вы обнаружите, что получаете много столкновений).
где
Вы также можете попробовать проверить, был ли каталог уже создан, а затем засыпать за случайное число миллисекунд, прежде чем повторять попытку.
Код PHP:
<?php $dirName = date( 'YmdHis', time() ); @mkdir( $dirName ) ?>
Вам действительно нужно быть случайным?
Если вам нужно, чтобы он был уникальным, я бы предложил создать счетчик и преобразовать целочисленный номер в шестнадцатеричный или даже лучше базовый 36 (26 символов + 10 цифр). После создания папки увеличьте счетчик, и вы хорошо пойдете.
php имеет стандартную функцию tmpnam, которая делает именно это; он создает уникальное имя файла (фактически создает файл, но может удалять и использовать в качестве папки позже 🙂
с требованием, чтобы он был уникальным и 7 символов, я бы, вероятно, использовал число, закодированное на основе 36 (0-9 и az), таким образом вы можете просто увидеть, что такое последняя папка, и увеличить ее, чтобы создать новую.
Затем проверьте, уникален ли он и регенерируется, если это не так. В некотором роде это лучше, чем сохранение состояния, как счетчик, потому что меньше может пойти не так.
do { $f = "rh" . mt_rand(10000,99999); } while (file_exists($f));
Я думаю, что лучший подход к именованию – это использование функции uniqid ().
$folder_name = uniqid();// eg: 4b3403665fea6
или со статическим префиксом:
$folder_name = uniqid('folder_'));// eg: folder_537834f6e981a
или с сегодняшним (дат) префиксом:
$folder_name = uniqid(date('hi-s')._); //eg: 04-23-59_537835dff2017