我正在研究一个小小的琐事,你可以用你自己的问题和答案进行自己的测验。我想为每个游戏制作一个URL(game.xx / QfsNS),而不是使用仅仅是自动增量id
的游戏的id
,我想要一个组合字母,就像你缩短网址一样。
我尝试过SHA-1,但它太长了,而且不一定非常复杂。
我该怎么办?
答案 0 :(得分:1)
最好使用像Yourls这样的脚本 - http://yourls.org/
这将生成您正在寻找的“短网址样式”链接。您不必担心冲突,或者您的算法是否足够随意。
将游戏的“长”网址传递给游戏 - 比如game.xx / game / football / etc / somthing / 98765432,它会缩短到game.xx / 123abc
答案 1 :(得分: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的独特性。
答案 2 :(得分: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;
}
答案 3 :(得分: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”时,请立即插入条目。
答案 4 :(得分:0)
您可以根据测验的ID编写自己的哈希算法。如果写得恰当,它将保证唯一性。