|
Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Сервис коротких урлов, каков алгоритм? |
|
|
Сервис коротких урлов, каков алгоритм?
|
Ветеран Сообщения: 1862 |
Есть ведь такие сервисы, самый известный - tinyurl.com. Мне вот интересно, как реализуется алгоритм по нахождению уникального слова. Ведь чем больше слов, тем дольше искать. Если в базе миллион слов, то придётся сравнивать каждое новое слово с уже используемыми. Или может сразу генерируется вся база слов, а потом просто делается связь слова со ссылкой. Правда база изначально будет вмещать несколько миллионов записей. Вот как лучше сделать?
|
|
------- Отправлено: 17:16, 14-07-2009 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать По-моему tinyurl.com никак не подбирает уникальное слово, а просто строит рандомную комбинацию из 6 символов.
1. Создать рандомную комбинацию букв латинского алфавита или использовать специальную хэш-функцию над url'ом. 2. Проверить наличие такой в базе. 3. В случае коллизии или п.1, или изменить один символ на следующий. В случае перехода на п.1 возможен очень долгий цикл, во втором случае - возникновение "кучи" и потери ценности хэш-системы. Но так ли это? Какова вероятность коллизии? Если брать только латинский алфавит, то 26 в степени 6 = 308 млн. с хвостиком. Если добавить к латиннице ещё и цифры, то уже 2,1 млрд. комбинаций. Думаю, этот сервис не настолько популярен, чтобы в нём часто возникали коллизии. |
Отправлено: 17:42, 14-07-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1862
|
Профиль | Сайт | Отправить PM | Цитировать Да 1 пункт мало волнует, как именно создать комбинацию из 6 символов.
Вот 2 пункт, проверка, вот в чём загвоздка. Ведь 308 млн. это общее количество уникальных комбинаций, реально коллизи начнутся меньше чем через миллион комбинация. Я проверял ![]() Насчёт популярности, это у нас не популярно, а у них весьма, тот же твиттер преобразовывал все ссылки через tinyurl.com. |
------- Отправлено: 20:29, 14-07-2009 | #3 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Второй пункт зависит исключительно от первого.
Хотел сейчас проверить вероятности коллизий, да после создания 16384 строк всё повисает (даже если маленькими порциями по 10000 записей добавлять). Наверное я что-то делаю не так... И всё-таки при 36-символьном алфавите (буквы+цифры) вероятность коллизии в пределах первых десяти миллионов записей ничтожно мала. Даже если и будет - сгенерировать просто другую запись. Сколько коллизий подряд выпадет в первой сотне миллионов? Вряд ли даже 10 штук. Другой вопрос - а справится ли СУБД с обработкой таблицы на 100 (или даже 10) млн. строк? ![]() Ещё можно записывать дату последнего обращения. Если потом попадается такая же случайная комбинация, то проверять - нет обращений 3-6 месяцев - записываем поверх новую ссылку. |
Последний раз редактировалось Coutty, 14-07-2009 в 22:24. Отправлено: 22:13, 14-07-2009 | #4 |
Deadooshka Сообщения: 2517
|
Профиль | Отправить PM | Цитировать Цитата Coutty:
|
||
Отправлено: 22:43, 14-07-2009 | #5 |
Ветеран Сообщения: 1862
|
Профиль | Сайт | Отправить PM | Цитировать Сделал базу и таблицу с 2 полями, первое поле уникальное. Слово состоит из 6 символов. Вставленно 1.999.048 записи.
Видно, что после 1 миллиона записей время увеличивается. Здесь 2 миллиона циклов. На вставку 200000 записей уходит по 10% = 24.054500818253 20% = 26.072400093079 30% = 27.169686079025 40% = 27.423403024673 50% = 27.355036973953 60% = 35.397845029831 70% = 47.092970848083 80% = 62.26985001564 90% = 81.317250967026 100% = 96.546401023865 Общее время = 454.699381 memory_get_usage = 82456 memory_get_peak_usage = 107236 То есть получается пропущенно 952 цикла, выходит на 2 миллиона вариантов - 952 коллизии. Здесь один миллион циклов. На вставку 100000 записей уходит по 10% = 12.130727052689 20% = 13.389132976532 30% = 12.968748092651 40% = 12.946455955505 50% = 14.068972110748 60% = 13.874950885773 70% = 14.403827905655 80% = 14.447467088699 90% = 14.580943107605 100% = 15.551143884659 Вставленно записей = 999779 Общее время = 138.36254 memory_get_usage = 84204 memory_get_peak_usage = 107616 |
------- Последний раз редактировалось Igor_I, 15-07-2009 в 01:53. Отправлено: 01:41, 15-07-2009 | #6 |
Deadooshka Сообщения: 2517
|
Профиль | Отправить PM | Цитировать имхо рандом тут неудачное решение... лучше реализовать последовательное изменение автонабора символов (a, b, ..., aa, ab,..., aaa, aab,...., aaaaaa, aaaaab, aaaaac.... и тд). Последнюю сгенерированную строку хранить в другом месте, чтобы на основании ее сделать следующий набор (последняя строка мб введена юзером - при наличии фичи, как на tinyurl).
|
Отправлено: 03:15, 15-07-2009 | #7 |
Ветеран Сообщения: 1862
|
Профиль | Сайт | Отправить PM | Цитировать Sham, вариант интересный, до такого не додумался
![]() |
------- Отправлено: 20:51, 15-07-2009 | #8 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Я думаю, что на том же tinyurl.com специально не стали использовать последовательную выдачу. Почему - другой вопрос.
|
Отправлено: 21:10, 15-07-2009 | #9 |
Deadooshka Сообщения: 2517
|
Профиль | Отправить PM | Цитировать Цитата Coutty:
|
|
Отправлено: 22:30, 15-07-2009 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Каков класс безопасности современных ОС? | M1sha | Хочу все знать | 4 | 11-03-2009 18:10 | |
Wireless - MIMO скорости ! (каков он, высокоскоростной Wi-Fi) | Tigr | Сетевое оборудование | 2 | 07-06-2008 14:49 | |
>100m/LongLink - каков предел? | Shera_Best | Сетевое оборудование | 3 | 06-06-2008 22:31 | |
[решено] Каков разгонный потенциал видеокарты GeForce 8800GT? | Красная Собака | Видеокарты | 9 | 27-02-2008 22:17 | |
8 коротких пиков!...ЧТО ДЕЛАТЬ!?!!?!?!? | kleola | Непонятные проблемы с Железом | 16 | 03-04-2007 23:55 |
|