Интересный вариант. Но мне лично uniqid() удобнее. А вариант генерации короткого имени не подскажете?
15000 14994
Идентично проверял но с количеством итераций 1000, дублей не выявил, обязательно учту ваши условия для последующих тестов.
p.s. Прокомментируйте, пожалуйста, решение для генерации короткого имени /ru/forum/comment/12838177, т.к. задействовал его в рабочем проекте интересует мнение специалиста в этом вопросе.
Вы не поняли :) не в количестве файлов дело, а в последовательности работы с ними. Еще раз попробую объяснить ситуацию, в которой ваш вариант вызовет ошибку.
Например, я загрузил 20 файлов во временную папку, провел необходимые операции над ними и только после этого переименовываю их для дальнейшей обработки.
Т.е. запускается цикл, который проходит по массиву файлов и генерирует им короткие и уникальные имена.
И тут как раз в вашем решении и возникнет ошибка дублирования. Если не верите, напишите функцию и убедитесь сами.
Возможно, я не так что-то делаю но вот что у меня получается по вашему варианту.
Для примера получим в цикле время с точностью до тысячных секунды (замете, что я беру тысячные секунды, а не сотые как предложили вы изначально)
13994852943243 13994852943243
13994852943244 13994852943244 13994852943244 13994852943244
13994852943245 13994852943245 13994852943245 13994852943245 13994852943245 13994852943245 13994852943245
13994852943246 13994852943246 13994852943246 13994852943246 13994852943246
Даже с учетом генерации имени через подстановку символов вместо чисел получим следующее.
3Yo0EFfn 3Yo0EFfn
3Yo0EFfo 3Yo0EFfo 3Yo0EFfo
3Yo0EFfp 3Yo0EFfp 3Yo0EFfp 3Yo0EFfp
3Yo0EFfq 3Yo0EFfq 3Yo0EFfq 3Yo0EFfq
3Yo0EFfr 3Yo0EFfr 3Yo0EFfr
Т.е. за одну тысячную секунды, взятую за основу генерации имени, можно создать несколько одинаковых вариантов.
Правы. Но! бывают разные ситуации, например при пакетной загрузке, когда нужно назначить имена сразу 30 уже загруженным файлам.
Да и как показывает практика, если есть вероятность ошибки (в нашем случае генерация повторных имен) то она обязательно произойдет.
С чего вы взяли, что можно предположить вероятность дублирования? Результат работы uniqid() получается на основе времени (с учетом десятитысячных (если не больше, т.к. не нашел про это инфы) секунды) а с такой точностью получить одно и то же значение не возможно, могу ошибаться, но у меня такая проблема не возникла. Тестировал на тысячах созданных имен в цикле и затем проверял на дубли, повторов не выявлено.
А вы напишите функцию, которая это делает, и вызовите ее раз 100 в цикле и посмотрите результат. Увидите много повторяющихся значений даже с учетом того, что вы берете время с точностью до сотых секунд.
Это я и описал в примере которое уже предлагали выше.
Берем время (точнее не время а некая величина похожая на время с ускорением в ~4,9 %) через uniqid() и переводим в другую систему исчисления (сопоставляя каждому числу символ из таблицы в зависимости от его разрядности).
Т.е. число 146744779621792 (основанное на времени) приводится в вид FFwuMxgs
Столкнулся с похожей задачей как у ТС. Напишу свое решение, возможно, кому-то пригодится.
Либо вы не увидели, либо не знаете что работа uniqid() основана на времени и возвращает уникальный (не повторяющийся) набор символов.
Пример
uniqid();//вернет результат - 536a23db892c8
В моем случае длина имени для файла в 13 символов, мягко говоря не устраивала, хотелось получить длину в 7-9 символов. Но возможно, вас устроит и такой вариант.
Интересная идея, взял ее за основу в своем решении. Однако, строить свою таблицу для перевода числа менее чем в 36-ную систему нет смысла. Т.к. это выполняет функция base_convert().
Учитывая, что результат uniqid() представляет собой целое число в 16-ой системе мы можем его сократить до 10 символов, переведя в 36-ую систему.
base_convert(uniqid(),16,36); //вернет результат - eg5z2u5ll9
Уже имеем 10 символов, лучше, но не то, что требовалось изначально.
Вот тут и принимаю решение написать перевод числа в 62-ную систему с использованием своей таблицы символов (0-9, a-z и A-Z).
Принцип работы. Результат uniqid() переводим в десятичную систему и уменьшаем его длину, после чего переводим в 62-ную и получаем уникальную строку длинной 8 символов.
Функция
function unic_name() { $dec = floor(base_convert(uniqid(),16,10)/10); $wiz = Array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f', 16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l', 22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r', 28 => 's', 29 => 't', 30 => 'u', 31 => 'v', 32 => 'w', 33 => 'x', 34 => 'y', 35 => 'z', 36 => 'A', 37 => 'B', 38 => 'C', 39 => 'D', 40 => 'E', 41 => 'F', 42 => 'G', 43 => 'H', 44 => 'I', 45 => 'J', 46 => 'K', 47 => 'L', 48 => 'M', 49 => 'N', 50 => 'O', 51 => 'P', 52 => 'Q', 53 => 'R', 54 => 'S', 55 => 'T', 56 => 'U', 57 => 'V', 58 => 'W', 59 => 'X', 60 => 'Y', 61 => 'Z'); while( $dec >= 1 ) { $name = $wiz[($dec%62)].$name; $dec /= 62; } return $name; }
Пример.
unic_name();//вернет результат - FFwe6qU7
У вас есть минимум 2 варианта.
1 – воспользоваться функцией uniqid() (результат которой основан на времени чем гарантируется уникальность создаваемых имен)
2 – взять за основу id строки. Но для этого придется выполнять 2 запроса к БД. Первый для записи информации о файле без имени, затем получаете id сделанной записи через mysql_insert_id() и генерируете короткое и уникальное имя на его основании тем же base_convert(id,10,36) затем вторым запросом обновляете поле с именем файла.
Как и ожидалось изначально.
В ветке постят, мягко говоря, все подряд, как хорошие так и не очень доски. Такое впечатление, что название темы никто, из разместивших пользователей ссылки на доски-пустышки, не читает либо не понимает его смысл. Ведь большая часть указанных ссылок в теме ведет на доски с отсутствующей активностью и посещаемостью (20-40 человек/сутки) на которые нет смысла тратить время.
Доски конечно красивые, но разве они являются крупными? Посещаемость 20-40 человек/сутки этого мало чтобы получить результат от размещения.
Посещаемости нет, активность отсутствует.
Посещаемости нет, движок предназначен для форума http://moscow.rusbb.ru/
Низкая посещаемость, разве это крупная доска?
Посещаемость 20 человек.
Посещаемость ~40 человек.
Посещаемости нет, активности пользователей также.
Надо же, такая молодая, а уже крупная и очень полезная. Несмотря на отсутствие активности и посещаемости.
Посещаемость 10-20 человек/сутки. Положительного эффекта от размещения не получить.
Все эти доски, бесспорно, имеют право на существование и при должном развитии спустя время смогут достичь высокой посещаемости и требуемой эффективности для разместивших свои объявления пользователей.
Но пока авторы этих площадок развивают свои ресурсы, напомним, что в Интернете уже сегодня имеется достаточно много действительно крупных досок с высокой активностью и посещаемостью, которые дают положительный эффект. Все эти доски мы стараемся разместить по адресу http://seocatalogs.info/board/ соблюдая при этом привязку по тематике и регионам.
Также сервис открыл отдельный раздел со списком каталогов компаний и организаций http://seocatalogs.info/org/
Если вы знаете действительно крупную доску или каталог компаний, которого нет в списке сервиса, то можете добавить его по ссылке http://seocatalogs.info/add/
Если правильно понял, попробуйте так
$str = '09 мар 16:00 Маттеучи, Алисе - Арканжоли, Манон 2:0 (6:4, 6:3)';
preg_match('/\d+:\d+ \(\d+:\d+, \d+:\d+\)/',$str,$res);
print $res[0];
Этого мало, не хватает кода функций упомянутых в этом куске.
Попробую вангануть, последнюю строку замените на эту
<?php the_category('<br>'); ?>
Если правильно понял, проиграйтесь с прозрачностью (opacity) в стиле изображений. Для себя недавно открыл этот параметр и использую именно к объектам при наведении.
Да еще есть http://etov.com.ua/, http://spravka.ua/ то что вспомнил. Остальные можете посмотреть тут http://seocatalogs.info/sites/
в фильтре поставьте следующее
Тематика:
- Компании, Организации
Регион:
- Общерегиональный
- Украина