我刚刚找到了这个伟大的教程,因为它是我需要的东西。
不过,看了一看,这似乎是没有效率的。它的工作方式是,首先生成一个唯一的键,然后检查它是否存在于数据库中,以确保它确实是唯一的。但是,数据库越大,函数得到的速度就越慢,对吗?
相反,我在想,有没有办法在这个函数中添加排序呢?因此,所要做的就是检查DB中的前一个条目并增加键。所以它永远都是独一无二的?
function generate_chars()
{
$num_chars = 4; //max length of random chars
$i = 0;
$my_keys = "123456789abcdefghijklmnopqrstuvwxyz"; //keys to be chosen from
$keys_length = strlen($my_keys);
$url = "";
while($i<$num_chars)
{
$rand_num = mt_rand(1, $keys_length-1);
$url .= $my_keys[$rand_num];
$i++;
}
return $url;
}
function isUnique($chars)
{
//check the uniqueness of the chars
global $link;
$q = "SELECT * FROM `urls` WHERE `unique_chars`='".$chars."'";
$r = mysql_query($q, $link);
//echo mysql_num_rows($r); die();
if( mysql_num_rows($r)>0 ):
return false;
else:
return true;
endif;
}发布于 2009-07-02 16:51:19
这些微小的url用户喜欢使用随机的标记,因为这样你就不能简单地运行微小的url链接。“2号去哪儿了?”“哦,太酷了!”“3号去哪儿了?”“更酷!”您可以输入随机字符,但不太可能达到有效值。
由于键非常稀疏(4个值,每个值有36种可能性,给出了1,679,616个唯一值,5给出了60,466,176)碰撞的可能性很小(实际上,这是设计中所希望的一部分),一个好的SQL索引将使查找变得简单(实际上,它是url的主要查找,因此它们会围绕它进行优化)。
如果您真的想避免查找,只需要取消自动增量,您就可以创建一个函数,该函数可以将一个整数转换为一个看似随机的字符串,并具有返回的能力。因此,"1“变成"54jcdn”,"2“变成"pqmw21”。类似于Base64 64编码,但不使用连续字符。
(*)我实际上喜欢使用少于36个字符--单大写,没有元音,也没有类似的字符(1,l,I)。这防止了偶然的脏话,也使人更容易对别人说出自己的价值。我甚至互相映射相似的字符,接受"0“表示"O”。如果你完全以机器为基础,你可以使用大小写和所有数字来实现更大的可能性。
发布于 2009-07-02 16:46:23
在数据库表中,unique_chars字段上有一个索引,所以我不明白为什么这会很慢或者效率很低。
UNIQUE KEY `unique_chars` (`unique_chars`)不要急于对你认为可能比较慢的事情进行过早的优化。
此外,url缩短服务可能有一些好处,它生成随机url,而不是顺序url。
发布于 2009-07-02 16:49:11
我不知道你为什么要费心。本教程的前提是创建一个“随机”URL。如果随机空间足够大,那么你可以仅仅依靠纯粹的,愚蠢的运气。如果随机字符空间为62个字符(A-Za-z0-9),则它们使用的4个字符,给定一个合理的随机数生成器,为1/ 62^4,即1/ 14,776,336。五个字符是916,132,832中的1。因此,一场冲突实际上是“十亿中的一个”。
显然,随着文件的填写,发生碰撞的可能性增加了。
有10,000份文件,是91,613份中的1份,几乎是100,000份中的1份(整数)。
这意味着,对于每一个新文档,您有1/ 91,613的机会再次命中数据库,以再次拉动老虎机。
这不是决定性的。是随机的。这是运气。从理论上讲,你可以撞上一串真的,真的,坏运气,只是在碰撞后得到碰撞。而且,它最终也会被填满。您打算使用多少个URL进行散列?
但是,如果91,613个几率中有1个是不够好的,那么将其提高到6个字符,就能使1万份文件的比例超过1/5。我们说的几乎是乐透赔率。
简单地说,使键足够大(7个字符?8个?)这个问题很大程度上是“愿望”本身的消失。
https://stackoverflow.com/questions/1075409
复制相似问题