Yur_OK

Yur_OK
Рейтинг
87
Регистрация
13.07.2006
LEOnidUKG:
я вроде со временем уже приводил вариант.

time().mt_rand(100000,999999).mt_rand(0,100);
никогда не повторится

Дальше хоть в MD5/SHA1

Интересный вариант. Но мне лично uniqid() удобнее. А вариант генерации короткого имени не подскажете?

Mad_Man:


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 уже загруженным файлам.

Да и как показывает практика, если есть вероятность ошибки (в нашем случае генерация повторных имен) то она обязательно произойдет.

gims:
В первом варианте говорить о гарантиях трудно поскольку можно предположить ситуацию где есть вероятность дублирования. Насколько ничтожной она не была.

С чего вы взяли, что можно предположить вероятность дублирования? Результат работы uniqid() получается на основе времени (с учетом десятитысячных (если не больше, т.к. не нашел про это инфы) секунды) а с такой точностью получить одно и то же значение не возможно, могу ошибаться, но у меня такая проблема не возникла. Тестировал на тысячах созданных имен в цикле и затем проверял на дубли, повторов не выявлено.

SeVlad:
А покритикуйте такое решение.

Берём полную дату+время с точностью до сотых сек. (получим число типа: 2014050718493612).

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

SeVlad:

Дальше вместо каждой цифры поставим допустимые символы, им соответствующие (хоть по своей таблице, хоть др. способами).

Это я и описал в примере которое уже предлагали выше.

Берем время (точнее не время а некая величина похожая на время с ускорением в ~4,9 %) через uniqid() и переводим в другую систему исчисления (сопоставляя каждому числу символ из таблицы в зависимости от его разрядности).

Т.е. число 146744779621792 (основанное на времени) приводится в вид FFwuMxgs

Столкнулся с похожей задачей как у ТС. Напишу свое решение, возможно, кому-то пригодится.

gims:
да, в вашем примере и во всех примерах выше генерируется случайная строка. Вероятность генерации одинаковых полей возможна, насколько мала она не казалось. Файлов очень много и такая ошибка не допустима.

Либо вы не увидели, либо не знаете что работа uniqid() основана на времени и возвращает уникальный (не повторяющийся) набор символов.

Пример

uniqid();//вернет результат - 536a23db892c8

В моем случае длина имени для файла в 13 символов, мягко говоря не устраивала, хотелось получить длину в 7-9 символов. Но возможно, вас устроит и такой вариант.

Mutabors:
А в чем проблема то? Строите свою таблицу символов, которая будет участвовать в формировании имени файла. Допустим
0123456789abc...z получаете 33-ю систему исчисления.

Интересная идея, взял ее за основу в своем решении. Однако, строить свою таблицу для перевода числа менее чем в 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
gims:
Я думаю в этом направлении. Только кто этим будет занимается? Если переложить все на php будут проблемы. Ведь нужно узнать у базы последнее значение, получить его инкремент и снова писать в бд название нового. Это не есть хорошо, поскольку в промежутке еще кто-то загрузит файл.
А вот инкремента строк в mysql не нашел..

У вас есть минимум 2 варианта.

1 – воспользоваться функцией uniqid() (результат которой основан на времени чем гарантируется уникальность создаваемых имен)

2 – взять за основу id строки. Но для этого придется выполнять 2 запроса к БД. Первый для записи информации о файле без имени, затем получаете id сделанной записи через mysql_insert_id() и генерируете короткое и уникальное имя на его основании тем же base_convert(id,10,36) затем вторым запросом обновляете поле с именем файла.

Как и ожидалось изначально.

AndyM:
получится тема с кучей досок и каталогов, бессмысленная и бесполезная.

В ветке постят, мягко говоря, все подряд, как хорошие так и не очень доски. Такое впечатление, что название темы никто, из разместивших пользователей ссылки на доски-пустышки, не читает либо не понимает его смысл. Ведь большая часть указанных ссылок в теме ведет на доски с отсутствующей активностью и посещаемостью (20-40 человек/сутки) на которые нет смысла тратить время.

Пример.

Доски конечно красивые, но разве они являются крупными? Посещаемость 20-40 человек/сутки этого мало чтобы получить результат от размещения.

Popogrup:
http://www.lompa.ru/ вроде нормальная доска...

Посещаемости нет, активность отсутствует.

Посещаемости нет, движок предназначен для форума http://moscow.rusbb.ru/

Низкая посещаемость, разве это крупная доска?

Kitoy:
Вот неплохая http://irecl.ru/catalog/ можно добавлять объявления, пресс релизы, статьи и даже посты в блог. ТИЦ 10

Посещаемость 20 человек.

Maksim Ghost:
Пара жемчужин из моей базы: informhit.ru vipmarka.ru

Посещаемость ~40 человек.

tibo:
Если не против, Бесплатная доска объявлений http://vipminsk.by/ и http://na-prokat.by/

Посещаемости нет, активности пользователей также.

eduard_gr:
Еще одна, правда совсем молодая, доска http://good-surf.ru/board/

Надо же, такая молодая, а уже крупная и очень полезная. Несмотря на отсутствие активности и посещаемости.

gera01:
Общетематические доски, много разделов. Можно разместить объявление надолго

http://www.doski-vip.ru/
http://doski-club.ru/
http://www.doski-obyavlenij.ru/
http://www.mir-obyavlenij.ru/
http://www.board-sale.ru/

Посещаемость 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) в стиле изображений. Для себя недавно открыл этот параметр и использую именно к объектам при наведении.

4ip:
НА сколько я знаю, кроме all.biz и prom.ua еще есть нормальные каталоги.

Да еще есть http://etov.com.ua/, http://spravka.ua/ то что вспомнил. Остальные можете посмотреть тут http://seocatalogs.info/sites/

в фильтре поставьте следующее

Тематика:

- Компании, Организации

Регион:

- Общерегиональный

- Украина

Всего: 215