13

我正在创建一个链接缩短服务,并且我正在使用递增 ID 字段的 base64 编码/解码来创建我的网址。ID 为“6”的 url 将是: http: //mysite.com/Ng==

我还需要允许用户创建自定义 url 名称,例如http://mysite.com/music

到目前为止,这是我的(可能是错误的)方法。帮助修复它将不胜感激。

当有人创建新链接时:

  • 我从数据库中获得了最大的链接 ID(它不是自动递增的)
  • 将 ID 加 1
  • 通过 base64_encoding 该 ID生成一个短 URL 代码 ( http://website.com/[short url name])
  • 插入链接表:id、short_url_code、destination_url

当有人创建新链接并传递自定义短 URL 时:

  • 我的计划是 base64_decode 他们的自定义字符串并将其用作链接 ID,但我没有意识到您不能只对任何字母数字字符串进行 base64_decode 并将其转换为数字。

是否有更好的编码方法可以让我将任何数字转换为短字符串,并将任何字符串转换为数字,因此我始终可以通过将名称转换为数字并查询链接来查找短 URL(无论是自定义的还是自动生成的) ID 等于那个数字?

4

2 回答 2

12

首先,确保IDshort_url_code列上有唯一性约束。

当有人创建新链接时:

  1. ID从数据库中获取下一个最大的链接(出于性能原因,您应该真正使用autoincrementorSEQUENCE,具体取决于您的 RDBMS 提供的内容;否则继续选择MAX(ID)+1
  2. 使用或任何其他自定义或标准编码方案生成短 URL 代码 ( http://website.com/[short url name])IDbase64_encode
  3. 插入links表格:ID, short_url_code, destination_url
  4. 如果由于违反约束而导致插入失败,请返回步骤 1 尝试新的ID; 您可能有违规行为,因为:

    1. 相同的 ID 已被另一个线程/进程等并行使用(即插入)(如果您使用or则不会发生这种情况,否则可能会经常发生),和/或autoincrementSEQUENCE
    2. 相同short_url_code的已被用作自定义 URL(除非有人试图在您的网站上造成麻烦,否则这种情况很少发生)
  5. 如果插入成功,则提交并返回短 URL 给用户

当有人创建新链接并传递自定义短 URL 时:

  1. 执行与上述相同的步骤 1
  2. ID不要像上面的步骤 2 那样生成短 URL 部分,而是使用short_url_code用户提供的自定义
  3. 执行与上述相同的步骤 3
  4. 如果插入失败是因为:
    1. 违反约束ID:返回步骤 1 尝试新的ID
    2. 违反约束short_url_code:向用户返回错误,要求他选择不同的自定义 URL,因为他/她提供的短 URL 已被使用
  5. 执行与上述相同的步骤 5
于 2010-03-04T00:17:13.907 回答
2

base64可以用来做短url,但也可以让url变长。例如,数字 1 的 base64_encode 是 'MQ==',它是大小的 4 倍。Base64 将始终有 2 个字符来获得 64 位,这对于短 url 来说并不理想。

如果大小是最重要的因素,那么您也许可以依靠国际化来生成最短的 url 。

这可以使 URI 相当长(单个 Unicode 字符最多 9 个 ASCII 字符),但其目的是浏览器只需要显示解码的形式,并且许多协议可以发送 UTF-8 而无需 %HH 转义。

请记住,浏览器可以很好地使用 UTF-8,而 twitter 对这些 url 没有任何问题。

于 2010-03-04T00:27:36.600 回答