如何实现可自定义的 URL 缩短器?

How to implement a URL shortener that can be customized?

我想实现一个 URL 缩短器,需要人们可以自定义缩短 url 代码。

在一个简单的 url 缩短器中,人们会得到一个很长 url 的混乱代码。但在某些情况下,可能需要自定义或指定短 url 以更具可读性和自解释性。例如, url.com/jimhome 而不是 url.com/D3aK1 。这产生了两个参数:long url 和指定的 short url。系统当然要检查短url是否被使用了。

我研究了 How to code a URL shortener?,发现它很好用。

我的想法是:在数据库中制作3个字段,id,长url,短url。对于没有自定义的常规请求,照做post,存储生成的短url.With自定义请求,先检查是否存在,如果不存在,插入长url和短url,但这打破了 ID 和 short url 之间的一致性。有没有更优雅的方式?

我的母语不是英语,如果您感到困惑,请发表评论。 提前致谢。

如果我理解正确,您试图避免的问题是每个 url 的 ID 由 mysql 自动递增分配,但自定义 url 需要具体ID.

避免这种情况的最简单方法是选择不同的 ID。例如,您可以采用当前的 unix 时间戳并将其用作您的 ID。

两个潜在的问题是生成相同的 ID(两个并发用户)和 URL 比您希望的要长。这可以通过以某种任意方式减少数量并在存在冲突时重试来解决。

示例:

//create a unique ID
$ID = time()/100000;

while(tableContains($ID))
     $ID++;

insertRow($ID, idToShortURL($ID), $longURL);

这个伪代码只是将其分割以使其更小。如果然后将递增 ID,直到它在添加它之前是唯一的。

自定义 ID 类似于:

$ID = urlToID($longURL);//using the method described in your linked question

if(tableContains($ID)
     echo 'Error: the custom url is already in use';
else
     insertRow($ID, idToShortURL($ID), $longURL);

我希望这不是太含糊,这只是我想到的第一件事。有上百万种合法方法可以实现目标。只要您以某种顺序独立于分配的 ID 的方式选择 ID,您就可以避免出现问题。