URL缩短算法

时间:2011-01-01 13:54:55

标签: java url url-shortener

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

  1. 获取完整网址
  2. 生成一个唯一的短字符串作为URL的键
  3. 将URL和密钥存储在数据库中(键值存储将是完美的匹配)
  4. 现在,关于第二点。以下是我的想法:

    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
    

    这还不错吗?

2 个答案:

答案 0 :(得分:4)

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

所以你的方法与我的方法类似。

答案 1 :(得分:2)

你的URL缩短是什么意思?

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

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

您可以输入任何代替产品名称的内容,只有最后的ID很重要。

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

然而:

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

这还不够好。

这取决于它。

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

谈到碰撞,我无法说清楚。 GUID被设计为没有冲突,但您只使用前6个字符。我不知道它们在算法中究竟代表什么。但它绝对不是最佳的。

但是,为什么不使用数据库自​​动递增主键?如果安全性很重要,那么你肯定会超过6个字符。

在我做过的项目中,我使用了类似

的东西

/数据库主键/哈希的-主键与 - 一些-令牌或客户端信息/

这样我可以直接在数据库中查找主键,这是最快的方法,但也可以验证链接是否被散列强制的粗暴发现。在我的例子中,哈希是客户端的秘密令牌和主键的SHA-1总和。