首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建自己的TinyURL

创建自己的TinyURL
EN

Stack Overflow用户
提问于 2009-07-02 16:36:08
回答 13查看 11.4K关注 0票数 4

我刚刚找到了这个伟大的教程,因为它是我需要的东西。

不过,看了一看,这似乎是没有效率的。它的工作方式是,首先生成一个唯一的键,然后检查它是否存在于数据库中,以确保它确实是唯一的。但是,数据库越大,函数得到的速度就越慢,对吗?

相反,我在想,有没有办法在这个函数中添加排序呢?因此,所要做的就是检查DB中的前一个条目并增加键。所以它永远都是独一无二的?

代码语言:javascript
复制
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;
}
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 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”。如果你完全以机器为基础,你可以使用大小写和所有数字来实现更大的可能性。

票数 13
EN

Stack Overflow用户

发布于 2009-07-02 16:46:23

在数据库表中,unique_chars字段上有一个索引,所以我不明白为什么这会很慢或者效率很低。

代码语言:javascript
复制
UNIQUE KEY `unique_chars` (`unique_chars`)

不要急于对你认为可能比较慢的事情进行过早的优化。

此外,url缩短服务可能有一些好处,它生成随机url,而不是顺序url。

票数 10
EN

Stack Overflow用户

发布于 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个?)这个问题很大程度上是“愿望”本身的消失。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1075409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档