- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева

Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Вы не поняли :) не в количестве файлов дело, а в последовательности работы с ними. Еще раз попробую объяснить ситуацию, в которой ваш вариант вызовет ошибку.
Например, я загрузил 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
Т.е. за одну тысячную секунды, взятую за основу генерации имени, можно создать несколько одинаковых вариантов.
я вроде со временем уже приводил вариант.
time().mt_rand(100000,999999).mt_rand(0,100);
никогда не повторится
Дальше хоть в MD5/SHA1
Да хоть 100 (даже самых мелких )! Всё равно на загрузку\генерацию_имени уйдет больше времени, чем 0,01сек на каждого. (Для особо параноидальных случаев можно и с точностью до 0,001 сек генерировать )
Машинное время измеряется в тактах, а не в секундах. Более того, в операционных системах, которые работают в Protected Mode (для вас - все ОСи) используются окна времени на каждую задачу. Никакой точности здесь нету.
Для велосипедистов и прочих любителей инкремента на единицу:
1. Генерируем пул (числа, строки, по барабану что) значений, которые нам могут быть доступны для использования. Проще всего задавать лимиты численных значений (от 0 до 1048576, например). Также проще всего рассматривать пул в виде разреженной матрицы (разреженная матрица - это матрица размером папиццот x дохрена, где хранятся только ненулевые значения ячеек для экономии памяти).
2. С помощью mt_rand и прочих псевдослучайных радостей ломимся к случайному элементу пула, перебираем их пока не наткнёмся на свободный.
3. Резервируем элемент.
4. Как только пул заполняется на 60% (после этого вероятность попадания к свободному элементу падает довольно быстро) - генерируем новый пул.
* Для параллельных систем на этапе (3) реализуем мьютекс на доступ к участку резервирования свободного элемента.
---------- Добавлено 07.05.2014 в 21:33 ----------
я вроде со временем уже приводил вариант.
time().mt_rand(100000,999999).mt_rand(0,100);
никогда не повторится
Дальше хоть в MD5/SHA1
Безграмотность зашкаливает.
я вроде со временем уже приводил вариант.
time().mt_rand(100000,999999).mt_rand(0,100);
никогда не повторится
Дальше хоть в MD5/SHA1
Интересный вариант. Но мне лично uniqid() удобнее. А вариант генерации короткого имени не подскажете?
Идентично проверял но с количеством итераций 1000, дублей не выявил, обязательно учту ваши условия для последующих тестов.
p.s. Прокомментируйте, пожалуйста, решение для генерации короткого имени /ru/forum/comment/12838177, т.к. задействовал его в рабочем проекте интересует мнение специалиста в этом вопросе.
Безграмотность зашкаливает.
Ой умный.... ГРАМОТНЫЙ то какой.
Я без тестов пример привёл куда копать.
Ну хочется больше уникальности, ну добавим числа побольше:
$arr = null;
for ($i = 0; $i < 500000; $i++)
{
$arr[] = time().mt_rand(100000,9999999).mt_rand(1000,999999);
}
echo count($arr);
echo '<br>';
echo count(array_unique($arr));
500000
500000
---------- Добавлено 08.05.2014 в 01:23 ----------
И то опять же всё зависит от времени выполнения. Я не думаю, что ТС нужно было 500 000 и более файлов загружать одновременно.
Ой умный.... ГРАМОТНЫЙ то какой.
Рак головного мозга не позволяет понять, что без учёта использованных значений нельзя быть уверенным в том, что значение уникально? Не беда - быть глупым не смертельно сейчас.
Рак головного мозга не позволяет понять, что без учёта использованных значений нельзя быть уверенным в том, что значение уникально? Не беда - быть глупым не смертельно сейчас.
Кто-то машину времени изобрёл и может возвращаться назад и пускать time() по кругу? Ясно... удаляюсь.
p.s. Прокомментируйте, пожалуйста, решение для генерации короткого имени /ru/forum/comment/12838177, т.к. задействовал его в рабочем проекте интересует мнение специалиста в этом вопросе.
На мой взгляд это единственный нормальный вариант. Сделать поле автоинкремент, брать его значение и преобразовать из десятичной системы в 62-ричную. Значение будет коротким и 100% уникальным.
Кто-то машину времени изобрёл и может возвращаться назад и пускать time() по кругу? Ясно... удаляюсь.
С каких пор вызов timestamp'a дважды подряд делает одну и ту же секунду уникальной?
На мой взгляд это единственный нормальный вариант. Сделать поле автоинкремент, брать его значение и преобразовать из десятичной системы в 62-ричную. Значение будет коротким и 100% уникальным.
... и предсказуемым. Довольно удобно выкачивать чужие фотки\доки и прочий хлам с файлопомойки, которая инкрементит адрес нового файла.
... и предсказуемым. Довольно удобно выкачивать чужие фотки\доки и прочий хлам с файлопомойки, которая инкрементит адрес нового файла.
Достаточно добавить к уникальной части "соль" — и нет проблем.