我正在研究一个小琐事,您可以在其中使用自己的问题和答案进行自己的测验。我想为每个游戏创建一个 URL (game.xx/QfsNS),而不是使用id
只是一个自动增量的游戏的id
,我想要一个字母组合,就像你缩短 URL 时一样网址。
我尝试了 SHA-1,但它太长了,而且它不必那么复杂。
我应该怎么办?
我正在研究一个小琐事,您可以在其中使用自己的问题和答案进行自己的测验。我想为每个游戏创建一个 URL (game.xx/QfsNS),而不是使用id
只是一个自动增量的游戏的id
,我想要一个字母组合,就像你缩短 URL 时一样网址。
我尝试了 SHA-1,但它太长了,而且它不必那么复杂。
我应该怎么办?
最好使用像 Yourls 这样的脚本 - http://yourls.org/
这将生成您正在寻找的“短 URL 样式”链接。您不必担心冲突,或者您的算法是否足够随机。
将游戏的“长” URL 传递给它——比如 game.xx/game/football/etc/somthing/98765432,它将缩短为 game.xx/123abc
每次需要新的 permid 时,都需要验证 db 表中的唯一性。
例如,创建一个名为 get_unique_permid() 的函数,它可能如下所示:
function get_unique_permid() {
while (true) {
$newid = random_string();
$res = mysql_query("SELECT permid FROM mytable WHERE permid = '$newid'");
if (mysql_num_rows($res) == 0) break; // it wasn't in the table, its good
}
return $newid;
}
请注意,我正在使用 Angy Gee 的 random_string 函数代码,在这篇文章中列出。此函数将不断循环,测试随机字符串,直到找到一个不在您的表中的字符串。它可能只需要不时尝试一次、两次甚至 3 次,具体取决于您的项目的受欢迎程度。
我猜如果它超级受欢迎,它甚至可以循环播放 10 次或更多。但至少它保证 permid 是独一无二的。
如果您将测验存储在数据库中,这可能会有所帮助,它不是很好,但它有效:
function random_string($length=6){
$str = "";
$characters = array('B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z','b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
$max = count($characters) - 1;
for ($i = 0; $i < $length; $i++){
$rand = rand(0, $max);
$str .= $characters[$rand];
}
return $str;
}
更短更好的随机化:
function random_string($length = 6) {
$str = '';
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
$max = count($characters) - 1;
for ($i = 0; $i < $length; $i+=1) {
$rand = mt_rand(0, $max);
$str .= $characters[$rand];
}
return $str;
}
或者,您也可以只生成一个 MD5-Hash(或任何其他算法)并缩短它:
echo substr(md5(time()), 0, 6);
最重要的部分是检查“ID”是否已经存在(冲突)。生成过程并不难。
您必须遍历所有数据库条目,只要生成的“ID”存在,并且一旦找到唯一的“ID”,插入条目。
您可以根据测验的 ID 编写自己的散列算法。如果编写得当,它将保证唯一性。