Сокращение URL:использовать индексный дескриптор в качестве короткого имени?

StackOverflow https://stackoverflow.com/questions/1323556

Вопрос

Сайт, над которым я работаю, хочет генерировать собственные сокращенные URL-адреса, а не полагаться на сторонние ресурсы, такие как tinyurl или bit.ly.

Очевидно, я мог бы вести текущий подсчет новых URL-адресов по мере их добавления на сайт и использовать их для создания коротких URL-адресов.Но я стараюсь избегать этого, если это возможно, поскольку кажется, что требуется много работы, чтобы заставить эту одну вещь работать.

Поскольку все, что требует коротких URL-адресов, является реальными физическими файлами на веб-сервере, мое текущее решение состоит в том, чтобы использовать их номера индексных дескрипторов, поскольку они уже сгенерированы для меня, готовы к использованию и гарантированно уникальны.

function short_name($file) {
   $ino = @fileinode($file);
   $s = base_convert($ino, 10, 36);
   return $s;
}

Кажется, это работает.Вопрос в том, что я могу сделать, чтобы короткий URL-адрес стал еще короче?

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

Могу ли я безопасно выбросить часть (половину?) бит индексного дескриптора?И если да, то должны ли это быть старшие или младшие биты?

Я думал об использовании crc32 имени файла, но на самом деле это делает мои короткие имена длиннее, чем при использовании индексного дескриптора.

Будет ли что-то подобное иметь какой-либо риск столкновений?Мне удалось перейти к однозначным числам, выбрав правильное значение «$referencefile».

function short_name($file) {
   $ino = @fileinode($file);
   // arbitrarily selected pre-existing file,
   // as all newer files will have higher inodes
   $ino = $ino - @fileinode($referencefile);
   $s = base_convert($ino, 10, 36);
   return $s;
}
Это было полезно?

Решение

Не уверен, что это хорошая идея:если вам придется сменить сервер или сменить диск/переформатировать его, номера инодов ваших файлов, скорее всего, изменятся...И все ваши короткие URL-адреса будут сломаны/потеряны!

То же самое, если по какой-либо причине вам нужно переместить файлы в другой раздел вашего диска, кстати.


Другая идея может заключаться в том, чтобы вычислить crc/md5/независимо от имени файла, как вы предложили, и использовать некоторый алгоритм для его «сокращения».

Вот пара статей об этом:

Другие советы

Там довольно умное использование файловой системы.Если вам гарантировано, что идентификаторы индексных дескрипторов уникальны, это быстрый способ генерации уникальных чисел.Интересно, сможет ли это работать стабильно в NFS, потому что, очевидно, разные машины будут иметь разные номера индексных дескрипторов.Затем вы просто сериализуете информацию о ссылке в файле, который вы там создаете.

Чтобы немного сократить URL-адреса, вы можете принять во внимание чувствительность к регистру и выполнить одну из безопасных кодировок (из нее вы получите примерно base62 - 10 [0-9] + 26 (a-z) + 26 (A-Z), или меньше, если вы удалите некоторые «конфликтные» буквы, например I против l против 1...существует множество примеров/библиотек).

Как вы сказали, вы также захотите «доставить» свои идентификаторы со смещением.Вам также нужно будет выяснить, как предотвратить создание временного файла/файла журнала и т. д. от использования вашего пространства ключей.

Проверить Урок Шон Инман;Еще не играл с ним, но это самостоятельное решение для создания URL-адресов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top