2

我正在研究一个小琐事,您可以在其中使用自己的问题和答案进行自己的测验。我想为每个游戏创建一个 URL (game.xx/QfsNS),而不是使用id只是一个自动增量的游戏的id,我想要一个字母组合,就像你缩短 URL 时一样网址。

我尝试了 SHA-1,但它太长了,而且它不必那么复杂。

我应该怎么办?

4

5 回答 5

1

最好使用像 Yourls 这样的脚本 - http://yourls.org/

这将生成您正在寻找的“短 URL 样式”链接。您不必担心冲突,或者您的算法是否足够随机。

将游戏的“长” URL 传递给它——比如 game.xx/game/football/etc/somthing/98765432,它将缩短为 game.xx/123abc

于 2013-07-07T19:09:52.490 回答
1

每次需要新的 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 是独一无二的。

于 2013-07-07T19:44:46.287 回答
0

如果您将测验存储在数据库中,这可能会有所帮助,它不是很好,但它有效:

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;
}
于 2013-07-07T18:46:39.127 回答
0

更短更好的随机化:

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”,插入条目。

于 2013-07-07T19:00:57.427 回答
0

您可以根据测验的 ID 编写自己的散列算法。如果编写得当,它将保证唯一性。

于 2013-07-07T19:03:01.887 回答