Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > укорачивание урлов (2 вопроса)


Автор: getme 21.8.2009, 23:39
делаю небольшой сайт, вотзникло несколько вопросов по оптимизации
нужно сгенерить случайную сторку для записи в БД, сделал вот так

Код

protected function genUrlKey($length = 5)
    {
      $key    = '';
      $token    = '0123456789bcdfghjkmnpqrstvwxyzAGKLMNOQPZYH'; 
      
      $i = 0;
      while ($i < $length) 
      { 
        $char = substr($token, mt_rand(0, strlen($token)-1), 1);
        
        if ( !stristr($key, $char)) 
        { 
          $key .= $char;
          $i++;
        }
      }
      
    $conn    = Zend_Db_Table::getDefaultAdapter();
    $whereTable    = $conn->select()->from('clips', array('COUNT(*)'));    
    $whereTable->where('clip_key = ?', $key);
    $nb        = $conn->fetchOne($whereTable);
        
    if($nb > 0 )
    {
       $key .= $nb+1; 
    }
        
      return $key;
    }


вообщем генерится случ. строка, далее проверятся есть ли она в БД, если до то добавляем к ключю кол-во существующих записей +1, таким образом ключ становится уникальным. 

мне интересно оптимален ли данный подход?
минусы которые я вижу, строка становится на N-символов длинее но это не критично
есть ли другие более оптимальные варианты?

еще видел вариант рекурсией, т.е генерация нового ключа и опять проверка в БД (ну это имхо полный бред)

Автор: Ипатьев 22.8.2009, 00:21
Непонятно, в чем вопрос. Каков критерий "оптимальности"? И при чем здесь "оптимизация"?
Цитата(getme @  21.8.2009,  23:39 Найти цитируемый пост)
еще видел вариант рекурсией, т.е генерация нового ключа и опять проверка в БД (ну это имхо полный бред)

во-первых, не надо называть цикл рекурсией.
во-вторых, непонятно, с какой стати бред. 

Автор: baldina 22.8.2009, 01:00
велосипед изобретаем?
http://us2.php.net/uniqid

а еще в таблице можно завести поле autoincrement (а может есть уже), его значение уникально в рамках таблицы. если хочется иметь крокозябры "для защищенности", его можно использовать как префикс в uniqid()

Автор: getme 22.8.2009, 14:18
ладно, болтать мне с вами некогда, вижу ничего нового, к тому что есть вы не добавите

Всем спасибо.

Автор: bars80080 22.8.2009, 14:34
ну, каков вопрос, таков ответ

Автор: SneG0K 22.8.2009, 14:49
getme, а что это за фигня? о_О Значения, проверки какие-то. Так многа букав, чтобы придумать уникальную строку.

Код

md5(rand(0, time()).time(), $token);


Уникальнее некуда. 

Автор: Ипатьев 22.8.2009, 21:49
md5 длинное слишком, на короткий урл не потянет. 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)