php - 创建你自己的 TinyURL

标签 php mysql

我刚找到这个 great tutorial,因为它是我需要的东西。

但是,看了之后,似乎这可能是低效的。它的工作方式是,首先生成一个唯一键,然后检查它是否存在于数据库中以确保它确实是唯一的。然而,数据库越大,函数越慢,对吧?

相反,我在想,有没有办法向这个函数添加排序?所以所有要做的就是检查数据库中的先前条目并增加 key 。所以它永远是独一无二的?

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;
}

最佳答案

小 url 人们喜欢使用随机标记,因为这样你就不能只控制小 url 链接。 “#2去哪儿了?” “哦,酷!” “#3 去哪儿了?” “更酷!”您可以输入随机字符,但不太可能输入有效值。

因为键相当稀疏(4 个值,每个值有 36* 种可能性给你 1,679,616 个唯一值,5 给你 60,466,176)冲突的机会很小(实际上,这是设计的理想部分)和一个很好的 SQL 索引将使查找变得微不足道(实际上,这是对 url 的主要查找,因此他们会围绕它进行优化)。

如果您真的想避免查找而只是取消自动递增,您可以创建一个函数,将整数转换为看似随机的字符串,并能够转换回来。所以“1”变成“54jcdn”,“2”变成“pqmw21”。类似于 Base64 编码,但不使用连续字符。

(*) 实际上我喜欢使用少于 36 个字符——单大小写,没有元音,也没有相似的字符(1、l、I)。这可以防止意外的脏话,也可以让某人更容易向其他人说出值(value)。我什至将相似的字符映射到彼此,接受“0”作为“O”。如果您完全基于机器,则可以使用大写和小写以及所有数字以获得更大的可能性。

关于php - 创建你自己的 TinyURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1075409/

相关文章:

php - 条件赋值

javascript - 表单不会通过ajax提交

php - 逃离 MySQL PHP

mysql - 为什么我没有从 Rails 的 ifnull 中获取值

mysql - 从 VB.Net 写入 MySQL。 VB使用逗号,但数据库只接受句号

mysql - 通过Visual C++ DLL通过局域网访问本地MySQL数据库

php - 显示包含搜索条件的搜索结果

php - Intervention\Image\Exception\NotReadableException 使用 laravel 4

php - 自定义字体不起作用。Codeigniter

mysql - 有条件地插入一行