1

我正在研究 url Shortener,目前我正面临随机生成字符串的问题。我想做的是:

  1. 生成一个随机字符串 [已经完成]
  2. 搜索数据库是否存在[已经完成]
  3. 如果它已经存在,则生成一个新的并再次进行检查 [ Stacked !]
  4. 如果它是独一无二的,则进行下一个流程

现在这是用于生成随机字符串的代码

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {
$str = '';
$count = strlen($charset);
while ($length--) {
    $str .= $charset[mt_rand(0, $count-1)];
}
return $str; }

我现在能做什么?

4

1 回答 1

8

使用 while 循环:

$random_string = randString(10);
$is_unique = false;

while (!$is_unique) {
    $result = query_the_database('SELECT id FROM table_with_random_strings WHERE random_string_column = "'.$random_string.'" LIMIT 1');
    if ($result === false)   // if you don't get a result, then you're good
        $is_unique = true;
    else                     // if you DO get a result, keep trying
        $random_string = randString(10);
}

我留下了通用的数据库代码,因为我不确定你在使用什么......但我希望它是mysqli或 PDO :)

还想提一下,有一些函数可以为您生成唯一的字符串,例如uniqid. 这样的函数可能会在第一次生成唯一字符串方面取得更大的成功,从而在while大多数情况下使循环变得不必要——这是一件好事。

echo uniqid(); // 502ec5b8ed2de

但是,您对length没有太多的控制权,如果这比您坚持使用自制随机生成器更重要 - 只是期望发生冲突的可能性更大。

编辑另一件事:通常,许多内容发布系统将使用文章标题,而不是对您的用户无意义的随机字符串。这被称为(有时)“post slug”。如果您的标题为“11 月 17 日:大猩猩狂野,裸照猿直播!”,则网址为:

http://www.mywebsiteaboutgorillas.com/november-17th-gorillas-gone-wild-topless-apes-live

这样的 URL 对您的用户的意义比:

http://www.mywebsiteaboutgorillas.com/jh7sj347dfj4

制作一个“post slug”:

function post_slug($url='', $sep='-') {
    // everything to lower and no spaces begin or end
    $url = strtolower(trim($url));

    // adding - for spaces and union characters
    $find = array(' ', '&', '\r\n', '\n', '+',',');
    $url = str_replace ($find, '-', $url);

    //delete and replace rest of special chars
    $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
    $repl = array('', '-', '');
    $url = preg_replace ($find, $repl, $url);

    if ($sep != '-')
        $url = str_replace('-', $sep, $url);

    //return the friendly url
    return $url; 
}

...您仍然需要注意那里的唯一性,有时 CMS 会将日期或 ID 作为伪子目录附加,以帮助减少重复。您也许可以在 URL 缩短器中使用类似的功能,以至少让用户知道他们将要点击什么。

文档

于 2012-08-17T22:22:12.727 回答