如何生成简短,独特的网址

时间:2014-07-26 20:44:41

标签: url short-url

我正在尝试为我网站上的项目生成唯一的简短网址。例如,用户可能会添加一个项目,结果网址可能是:

http://example.com/item/abc

我希望唯一标识符由3或4个字符组成,其中字符是字母和数字。我想的不是随机生成字符串,而是确保它们是唯一的并且还没有使用过,我可以提前生成它们并将它们存储在数据库中。然后当用户添加项目时,我可以从数据库中选择下一个缩短的url字符串并将其分配给该项目。这是解决这个问题的好方法吗?还有更好的方法吗?我认为它会变得更简单,因为它们已经生成了。但是,我还可以看到潜在的竞赛问题,两个项目被分配了相同的识别字符串,我不确定LOCK TABLES是否是最佳解决方案。

另外,如果不使用LOCK TABLES,这样的话可以保证MySQL不会出现竞争条件吗?

update ids set item_id=1 WHERE id=(SELECT id FROM ids WHERE item_id IS NULL LIMIT 1);

然后我可以选择ID为1的项目的ID?在那个查询期间,没有其他查询可以声明它吗?

2 个答案:

答案 0 :(得分:3)

对于后来发现此问题的任何人,我都会按照@Swapnil建议的链接中建议的流程进行操作:

How to code a URL shortener?

在那里列出了一些针对各种语言的实现,但是我使用的是Perl,并且那里没有列出,我似乎找不到其他地方已经存在的perl。因此,如果它在将来帮助任何人,我写了这个perl模块来帮助缩短网址:

Short::URL

感谢@Swapnil将我指向了正确的位置。

答案 1 :(得分:1)

关于你的简短网址问题。

您可以用缩短的表示法对网址进行编码。

在python中你可以对url进行哈希处理,然后将其编码为b64,这将减少长度,并为url提供唯一的表示

>>> import base64
>>> import md5
>>> url = '/item/abc'
>>> hash = md5.new(url).digest()[-4:] # get the hash for the url
>>> hash = _hash.replace('=','').replace('/','_')  # some cleaning
>>> print base64.b64encode(hash)
'CVKi2Q'