Как лучше сгенерировать уникальное название для загружаемых файлов

1 234
Yur_OK
На сайте с 13.07.2006
Offline
87
#21

Вы не поняли :) не в количестве файлов дело, а в последовательности работы с ними. Еще раз попробую объяснить ситуацию, в которой ваш вариант вызовет ошибку.

Например, я загрузил 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

Т.е. за одну тысячную секунды, взятую за основу генерации имени, можно создать несколько одинаковых вариантов.

Сердце бьется, мысли зреют, мозг не спит! Облачная база каталогов (/ru/forum/708603)
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#22

я вроде со временем уже приводил вариант.

time().mt_rand(100000,999999).mt_rand(0,100);

никогда не повторится

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

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
Mad_Man
На сайте с 10.11.2008
Offline
162
#23
SeVlad:
Да хоть 100 (даже самых мелких )! Всё равно на загрузку\генерацию_имени уйдет больше времени, чем 0,01сек на каждого. (Для особо параноидальных случаев можно и с точностью до 0,001 сек генерировать )

Машинное время измеряется в тактах, а не в секундах. Более того, в операционных системах, которые работают в Protected Mode (для вас - все ОСи) используются окна времени на каждую задачу. Никакой точности здесь нету.

Для велосипедистов и прочих любителей инкремента на единицу:

1. Генерируем пул (числа, строки, по барабану что) значений, которые нам могут быть доступны для использования. Проще всего задавать лимиты численных значений (от 0 до 1048576, например). Также проще всего рассматривать пул в виде разреженной матрицы (разреженная матрица - это матрица размером папиццот x дохрена, где хранятся только ненулевые значения ячеек для экономии памяти).

2. С помощью mt_rand и прочих псевдослучайных радостей ломимся к случайному элементу пула, перебираем их пока не наткнёмся на свободный.

3. Резервируем элемент.

4. Как только пул заполняется на 60% (после этого вероятность попадания к свободному элементу падает довольно быстро) - генерируем новый пул.

* Для параллельных систем на этапе (3) реализуем мьютекс на доступ к участку резервирования свободного элемента.

---------- Добавлено 07.05.2014 в 21:33 ----------

LEOnidUKG:
я вроде со временем уже приводил вариант.

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

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

<?

$arr = null;

for ($i = 0; $i < 15000; $i++)
{
$arr[] = time().mt_rand(100000,999999).mt_rand(0,100);
}

echo count($arr);
echo count(array_unique($arr));


15000
14994

Безграмотность зашкаливает.

Yur_OK
На сайте с 13.07.2006
Offline
87
#24
LEOnidUKG:
я вроде со временем уже приводил вариант.

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

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

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

Mad_Man:


15000
14994

Идентично проверял но с количеством итераций 1000, дублей не выявил, обязательно учту ваши условия для последующих тестов.

p.s. Прокомментируйте, пожалуйста, решение для генерации короткого имени /ru/forum/comment/12838177, т.к. задействовал его в рабочем проекте интересует мнение специалиста в этом вопросе.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#25
Mad_Man:

Безграмотность зашкаливает.

Ой умный.... ГРАМОТНЫЙ то какой.

Я без тестов пример привёл куда копать.

Ну хочется больше уникальности, ну добавим числа побольше:

$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 и более файлов загружать одновременно.

Mad_Man
На сайте с 10.11.2008
Offline
162
#26
LEOnidUKG:
Ой умный.... ГРАМОТНЫЙ то какой.

Рак головного мозга не позволяет понять, что без учёта использованных значений нельзя быть уверенным в том, что значение уникально? Не беда - быть глупым не смертельно сейчас.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#27
Mad_Man:
Рак головного мозга не позволяет понять, что без учёта использованных значений нельзя быть уверенным в том, что значение уникально? Не беда - быть глупым не смертельно сейчас.

Кто-то машину времени изобрёл и может возвращаться назад и пускать time() по кругу? Ясно... удаляюсь.

G
На сайте с 13.03.2014
Offline
4
#28
Yur_OK:

p.s. Прокомментируйте, пожалуйста, решение для генерации короткого имени /ru/forum/comment/12838177, т.к. задействовал его в рабочем проекте интересует мнение специалиста в этом вопросе.

На мой взгляд это единственный нормальный вариант. Сделать поле автоинкремент, брать его значение и преобразовать из десятичной системы в 62-ричную. Значение будет коротким и 100% уникальным.

Mad_Man
На сайте с 10.11.2008
Offline
162
#29
LEOnidUKG:
Кто-то машину времени изобрёл и может возвращаться назад и пускать time() по кругу? Ясно... удаляюсь.

С каких пор вызов timestamp'a дважды подряд делает одну и ту же секунду уникальной?

gims:
На мой взгляд это единственный нормальный вариант. Сделать поле автоинкремент, брать его значение и преобразовать из десятичной системы в 62-ричную. Значение будет коротким и 100% уникальным.

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

[umka]
На сайте с 25.05.2008
Offline
456
#30
Mad_Man:
... и предсказуемым. Довольно удобно выкачивать чужие фотки\доки и прочий хлам с файлопомойки, которая инкрементит адрес нового файла.

Достаточно добавить к уникальной части "соль" — и нет проблем.

Лог в помощь!
1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий