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

Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко

В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Интересно, как на ютубе названия генерятся, символов не так много, не боятся что повторятся)
Если не изменяет память, там сделано как в укорачивании ссылок, просто по порядку.
Если не изменяет память, там сделано как в укорачивании ссылок, просто по порядку.
Понятное дело что берется инкремент предыдущей стоки) Это как автоинкримент для числовых строк в mysql. Хотя как вижу большинство генерируют рандомный набор чисел, символов и еще колдуют над ней) Не спорю для маленьких сайтов может это и допустима но для крупных проектов это не допустимо. Вопрос остается в том как это грамотно реализовать.
Столкнулся с похожей задачей как у ТС. Напишу свое решение, возможно, кому-то пригодится.
да, в вашем примере и во всех примерах выше генерируется случайная строка. Вероятность генерации одинаковых полей возможна, насколько мала она не казалось. Файлов очень много и такая ошибка не допустима.
Либо вы не увидели, либо не знаете что работа uniqid() основана на времени и возвращает уникальный (не повторяющийся) набор символов.
Пример
В моем случае длина имени для файла в 13 символов, мягко говоря не устраивала, хотелось получить длину в 7-9 символов. Но возможно, вас устроит и такой вариант.
А в чем проблема то? Строите свою таблицу символов, которая будет участвовать в формировании имени файла. Допустим
0123456789abc...z получаете 33-ю систему исчисления.
Интересная идея, взял ее за основу в своем решении. Однако, строить свою таблицу для перевода числа менее чем в 36-ную систему нет смысла. Т.к. это выполняет функция base_convert().
Учитывая, что результат uniqid() представляет собой целое число в 16-ой системе мы можем его сократить до 10 символов, переведя в 36-ую систему.
Пример
Уже имеем 10 символов, лучше, но не то, что требовалось изначально.
Вот тут и принимаю решение написать перевод числа в 62-ную систему с использованием своей таблицы символов (0-9, a-z и A-Z).
Принцип работы. Результат uniqid() переводим в десятичную систему и уменьшаем его длину, после чего переводим в 62-ную и получаем уникальную строку длинной 8 символов.
Функция
Пример.
Я думаю в этом направлении. Только кто этим будет занимается? Если переложить все на php будут проблемы. Ведь нужно узнать у базы последнее значение, получить его инкремент и снова писать в бд название нового. Это не есть хорошо, поскольку в промежутке еще кто-то загрузит файл.
А вот инкремента строк в mysql не нашел..
У вас есть минимум 2 варианта.
1 – воспользоваться функцией uniqid() (результат которой основан на времени чем гарантируется уникальность создаваемых имен)
2 – взять за основу id строки. Но для этого придется выполнять 2 запроса к БД. Первый для записи информации о файле без имени, затем получаете id сделанной записи через mysql_insert_id() и генерируете короткое и уникальное имя на его основании тем же base_convert(id,10,36) затем вторым запросом обновляете поле с именем файла.
Строите свою таблицу символов, которая будет участвовать в формировании имени файла. Допустим
0123456789abc...z получаете 33-ю систему исчисления.
Почему 33? 😕
36, если 10 цифр и все буквы латинского алфавита.
У вас есть минимум 2 варианта.
1 – воспользоваться функцией uniqid() (результат которой основан на времени чем гарантируется уникальность создаваемых имен)
2 – взять за основу id строки. Но для этого придется выполнять 2 запроса к БД. Первый для записи информации о файле без имени, затем получаете id сделанной записи через mysql_insert_id() и генерируете короткое и уникальное имя на его основании тем же base_convert(id,10,36) затем вторым запросом обновляете поле с именем файла.
Спасибо, уже нашел пару статей про сервисы сокращения ссылок.
В первом варианте говорить о гарантиях трудно поскольку можно предположить ситуацию где есть вероятность дублирования. Насколько ничтожной она не была.
Второй вариант это то что используют сервисы сокращения ссылок. Возможно какие-то крутые сервисы имеют собственные бд и у них все это реализовано на уровне бд. Пока бд не возьмет эту работу на себя придется несколькими запросами работать.
А покритикуйте такое решение.
Берём полную дату+время с точностью до сотых сек. (получим число типа: 2014050718493612).
Дальше вместо каждой цифры поставим допустимые символы, им соответствующие (хоть по своей таблице, хоть др. способами).
Уникальность тут 100%, а что со скоростью\нагрузками по сравнению с мд5\mt_rand при достаточно плотной генерации результатов?
В первом варианте говорить о гарантиях трудно поскольку можно предположить ситуацию где есть вероятность дублирования. Насколько ничтожной она не была.
С чего вы взяли, что можно предположить вероятность дублирования? Результат работы uniqid() получается на основе времени (с учетом десятитысячных (если не больше, т.к. не нашел про это инфы) секунды) а с такой точностью получить одно и то же значение не возможно, могу ошибаться, но у меня такая проблема не возникла. Тестировал на тысячах созданных имен в цикле и затем проверял на дубли, повторов не выявлено.
А покритикуйте такое решение.
Берём полную дату+время с точностью до сотых сек. (получим число типа: 2014050718493612).
А вы напишите функцию, которая это делает, и вызовите ее раз 100 в цикле и посмотрите результат. Увидите много повторяющихся значений даже с учетом того, что вы берете время с точностью до сотых секунд.
Дальше вместо каждой цифры поставим допустимые символы, им соответствующие (хоть по своей таблице, хоть др. способами).
Это я и описал в примере которое уже предлагали выше.
Берем время (точнее не время а некая величина похожая на время с ускорением в ~4,9 %) через uniqid() и переводим в другую систему исчисления (сопоставляя каждому числу символ из таблицы в зависимости от его разрядности).
Т.е. число 146744779621792 (основанное на времени) приводится в вид FFwuMxgs
А вы напишите функцию, которая это делает, и вызовите ее раз 100 в цикле и посмотрите результат. Увидите много повторяющихся значений даже с учетом того, что вы берете время с точностью до сотых секунд.
Речь о генерации названий файлов при их загрузке. Одновременно (с точностью до сотых сек.) файлы не могут быть загружены (или я не прав?). Отсюда - с чего бы повторяющиеся значения?
Правы. Но! бывают разные ситуации, например при пакетной загрузке, когда нужно назначить имена сразу 30 уже загруженным файлам.
Да и как показывает практика, если есть вероятность ошибки (в нашем случае генерация повторных имен) то она обязательно произойдет.
например при пакетной загрузке, когда нужно назначить имена сразу 30 уже загруженным файлам.
Да хоть 100 (даже самых мелких :))! Всё равно на загрузку\генерацию_имени уйдет больше времени, чем 0,01сек на каждого. (Для особо параноидальных случаев можно и с точностью до 0,001 сек генерировать :))
В уникальности имён* в моём варианте я уверен . А вот в целесообразности (скорости\нагрузки и тд) - сомневаюсь.
* для задач в стартпосте.