我正在开发一个url Shortener,目前我遇到了Random Generated String的问题。我想做的事情是:
现在这是代码用于生成随机字符串
function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {
$str = '';
$count = strlen($charset);
while ($length--) {
$str .= $charset[mt_rand(0, $count-1)];
}
return $str; }
我现在能做什么?
答案 0 :(得分: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
但是,你没有那么多的长度的控制权,如果这比你自己的自制随机发生器更重要 - 只是期望碰撞的可能性更大。
编辑另一件事:通常,许多内容发布系统会使用文章标题,而不是对用户毫无意义的随机字符串。这被称为(有时)“后塞”。如果你有一个标题为“11月17日:大猩猩去野外,裸照猿人活!”,网址将是:
http://www.mywebsiteaboutgorillas.com/november-17th-gorillas-gone-wild-topless-apes-live
这样的网址比您的用户更有意义:
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缩短器中,以便为用户提供至少一些他们将要点击的内容的指示。
<强>文档强>