2

我知道创建一个短 url 算法并不像散列一个 URL 然后将散列切碎到其自身的某个增量版本那么容易。即使从外部的角度来看,这就是它看起来正在发生的事情。我已经阅读了一些关于这个想法的文章,也看到了一些在行动中的文章。但似乎没有人担心未来的证明。

所以我在这里试图找出如何使用 PHP 来解决这个问题,并找到至少可以避免常见问题的方法。从数据库冲突到除了整体存储和数据库大小之外可能需要担心的任何其他问题。

我肯定会面临的一个问题是我正在创建的服务正在从我的好友正在创建的另一项服务中获取用户端 URL,因此我们基于每个用户跟踪短 URL,因此可能多个用户最终可能使用相同的长url 但我们需要为每个提供 URL 的用户使用不同的短 url id。想想几个用户分享了一个最近流行的 youtube 视频。

因此,创建一个不会同时面对许多 bash 的短 url 算法的最佳策略是什么,这将允许我使用一些可能的短 URL 查询我的数据库,以查看它们是否已经存在。

更好的是,有什么方法我可以通过 mySQL 功能创建唯一的 id,这在概念上循环直到一个是唯一的,因此为这个原因而创建?

我知道我在这里拉着稻草,这是一个相当开放的问题。但我试图在深入构建过程之前巧妙地思考,后来才发现我搞砸了。在确保我对此采取半理智的方法之前,我需要一些输入。

4

3 回答 3

1

你可以使用这个用 PHP 制作的短 URL 算法——它会为同一个 url 生成四个不同的“哈希”。

创建一个类似的表

id |    original_url        |   short_url
------------------------------------------
1    http://www.google.com/     tm5kxb

当用户输入要缩短的 URL 时,您使用文章中的函数并接收四个不同哈希的数组。然后您可以使用如下查询:

SELECT id FROM {your_table} WHERE short_url = "{a_hash_from_the_function}"

如果查询没有返回结果,则表示没有匹配,您可以使用这个。如果查询返回结果,只需使用数组中的另一个散列,看看它是否存在,等等。

阅读整篇文章,因为作者在底部解释了如何使您的哈希更加不可预测。我建议使用与 不同的哈希算法md5(),但您必须自己进行试验。:)

于 2012-05-27T10:04:40.490 回答
0

假设您有一个urlShortened表

id  | url
-----------------
1     http://ecc

这两个字段都INDEXUNIQUE您的数据库中,因此如果您需要知道一个 url 已经存在,只需进行选择:

SELECT id FROM urlShortened WHERE url  = 'http://anUrl'

这也将防止插入重复的网址

如果您需要每个用户拥有唯一的 url,只需添加另一个字段 ( ) 并在两个字段 ( )userId上创建唯一索引url,userId

id  | url           | userId
-----------------------------
1     http://site1    1
2     http://site1    2
于 2012-05-27T09:51:18.483 回答
0

这是

function shorturl($input) { ... }

上面SNIPPET IT页面中的函数,从 PHP 转换为 C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

public static List<string> shorturl(string input) {
    var md5 = MD5.Create();
    var base32 = new char[] {
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
        'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
        'y', 'z', '0', '1', '2', '3', '4', '5'
    };

    var hex = string.Join("", md5.ComputeHash(Encoding.ASCII.GetBytes(input)).Select(a => a.ToString("x2")));
    var hexLen = hex.Length;
    var subHexLen = hexLen / 8;
    var output = new List<string>();

    for (var i = 0; i < subHexLen; i++) {
        var subHex = hex.Substring(i * 8, 8);
        var @int = 0x3FFFFFFF & Convert.ToUInt32("0x" + subHex, 16);
        var @out = "";
            for (var j = 0; j < 6; j++) {
            var val = 0x0000001F & @int;
            @out += base32[val];
            @int = @int >> 5;
        }

        output.Add(@out);
    }

    return output;
}
于 2012-06-06T23:48:59.237 回答