网址缩短算法

2022-09-02 04:49:40

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

  1. 获取完整的网址
  2. 生成唯一的短字符串作为 URL 的键
  3. 将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

这足够好吗?


答案 1

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

所以你的阿普鲁克和我做的差不多。


答案 2

那么URL缩短是什么意思?

有非常不同的技术。大多数网站AFAIK使用该技术只是将databse主键(可能以某种编码形式)形式放在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总和。