3

我正在尝试为我网站上的项目生成独特的短网址。例如,用户可能会添加一个项目,结果 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?在该查询期间,没有其他查询能够声明它吗?

4

2 回答 2

3

对于以后发现此问题的任何人,我都遵循@Swapnil 建议的链接中建议的过程:

如何编写 URL 缩短器?

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

短::网址

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

于 2014-07-27T00:09:58.700 回答
1

只是关于你的短网址问题。

您可以以缩短表示形式对 url 进行编码。

在 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'
于 2014-07-26T21:02:44.367 回答