ShortLinks - сокращатель ссылок.

Пакет генерирует alias на основе времени создания и заголовка ресурса, затем пропускает через md5() и сокращает до нужной длинны (выставляется в настройках).
Таким образом получает alias вида — b79bcf


p.s. Не спрашивайте зачем это надо))) Возможно кому то понадобится. Пакет тут.
Володя
08 сентября 2014, 14:41
modx.pro
3
2 242
+3
Поблагодарить автора Отправить деньги

Комментарии: 3

Алексей Карташов
08 сентября 2014, 21:18
+1
Хм, что-то мне кажется, что коллизии очень даже возможны, ибо есть вероятность появления коллизий при полной md5-строке, а уж при обрезанной и подавно.
Этот момент как-то обрабатывается? (я код не смотрел)

Если нет, то имеет смысл добавить проверку при генерации — существует ли такой идентификатор у другого документа и, если существует, перехешировать, добавив какой-то дополнительный параметр, уникальный для этого ресурса.
И так в цикле, пока не получим уникальный сокращённый идентификатор.
Может быть ещё имеет смысл хранить в базе те поля, которые использовались для генерации короткого урла, в том же порядке, чтобы потом иметь возможность восстановить этот код, а то мало ли.
    Володя
    08 сентября 2014, 21:26
    +1
    да теоретически вполне возможны коллизии, ты абсолютно прав.
    но выставив длину псевдонима в 6ть я прогнал в цикле по 5000 ресурсов 5раз…
    при этом имя ресурса было просто номером итерации. В итоге я не увидел ни одного дублирующего псевдонима что для меня явилось достаточным при решении поставленной задачи…

    p.s. проверку прикручу если этот пакет вообще для кого то будет актуальным…
    В целом спасибо за критику)
      Василий Наумкин
      09 сентября 2014, 06:29
      0
      Я бы вообще сделал в схеме этот объект наследником xPDOObject и прописал сокращенную ссылку как Primary Key.

      Ну и проверка перед сохранением, конечно:
      if (!$modx->getCount('ShortLink', $link)) {
      	$object = $modx->newObject('ShortLink');
      	$object->fromArray(array(
      		'link' => $link,
      		// ...
      	), '', true, true);
      	
      	$object->save();
      }
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3