URL缩短算法

Posted

技术标签:

【中文标题】URL缩短算法【英文标题】:URL shortening algorithm 【发布时间】:2011-06-02 05:37:58 【问题描述】:

现在,这并不是严格意义上的 URL 缩短,但无论如何我的目的是这样的,所以让我们这样看待它。当然 URL 缩短的步骤是:

    获取完整网址 生成唯一的短字符串作为 URL 的键 将 URL 和键存储在数据库中(键值存储在这里是完美的匹配)

现在,关于第二点。这是我想出的:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
UUID uuid = UUID.randomUUID();
dos.writeLong(uuid.getMostSignificantBits());
String encoded = new String(Base64.encodeBase64(baos.toByteArray()), "ISO-8859-1");
String shortUrlKey = StringUtils.left(encoded, 6); // returns the leftmost 6 characters
// check if exists in database, repeat until it does not

这够好吗?

【问题讨论】:

出于好奇,为什么要使用 UUID?例如,为什么不从 Random 实例生成 5 个左右的字节? 我开始使用随机/System.nanoTime/mac 地址'位然后意识到 uuid 拥有所有这些 :-) @Bozho 您可能需要考虑Base32 encoding aka Crockford encoding,因为它具有一些优点,例如删除可能不明确的字符,例如 0 和字母 L。您最终会得到更长的短 URL,但如果您不这样做拥有数十亿可能值得。 【参考方案1】:

对于我编写的文件上传应用程序,我也需要此功能。阅读this SO article 后,我决定只使用一些随机数并检查它们是否存在于数据库中。

所以你的方法和我做的很相似。

【讨论】:

【参考方案2】:

那么你所说的 URL 缩短是什么意思?

有非常不同的技术。大多数网站(AFAIK)使用该技术将数据库主键(可能以某种编码形式)放在 URL 中的某个位置,可以通过正则表达式对其进行解析,并使用关键字增强其余部分。

来自亚马逊的示例:http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

您可以输入任何内容来代替产品名称,只有末尾的 id 很重要。

但是,您可能希望保持链接干净并检查其是否正确,并执行 301 转发到真实 URL 或在出现错误 URL 时放置规范 URL。

但是:

如果你想做TinyURL 这样的事情,我的回答是肯定的。

这还不够好。

这取决于。

这不是“安全的”。猜测 URL 非常容易。更好的方法是使用一些加密函数,如 SHA-1/MD5。

当涉及到碰撞时,我真的说不出来。 GUID 设计为没有冲突,但您只使用前 6 个字符。我不知道它们在算法中到底代表什么。但这绝对不是最优的。

但是,为什么不只使用数据库自​​动递增主键?如果安全性很重要,您肯定也必须使用 6 个以上的字符。

在我做的一个项目中,我使用了类似的东西

/database-primary-key/hash-of-primary-key-with-some-token-or-client-information/

通过这种方式,我可以直接在数据库中查找主键,这是最快的方式,但也可以验证该链接是否没有被哈希强制暴力发现。在我的例子中,哈希是客户端的秘密令牌和主键的 SHA-1 总和。

【讨论】:

为什么你认为很容易猜测 URL?我不这么认为。散列函数产生的输出比我需要的要大,所以我不得不再次修剪。散列的数据库主键可能很好,但数据库没有必要为此提供选项。键值存储不 对于一个更短的 URL,为什么有人能猜到一个 URL 很重要?最终,它们应该被重定向到该页面,并且访问将是公开的(对于沼泽标准网页)或受到其他方式的限制。 取决于用例@Rob。如果是这样,为什么要进行任何散列而不只是使用自动增量?我只是想弄清楚问题中的用例和要求不清楚。 好吧,你用“如果你想做 TinyURL 之类的事情”来限定声明,这是相当标准的 URL 缩短案例。您帖子的其余部分似乎暗示它正在谈论更类似于 URL 路由/重写的东西,在这种情况下;是的,您可能希望您的应用程序标识符不易被猜测,但当然,您也不应该将其作为安全措施。 那么问题到底是什么?

以上是关于URL缩短算法的主要内容,如果未能解决你的问题,请参考以下文章

网址缩短网站如何工作?

URL短网址系统的算法设计及实践

缩短 sklearn 逻辑回归的运行时间

Linux(程序设计):28---数据流压缩原理(Deflate压缩算法gzipzlib)

Node.js child_process exec 的标准输出被缩短

扩展kmp算法