我正在尝试为我网站上的项目生成唯一的简短网址。例如,用户可能会添加一个项目,结果网址可能是:
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?在那个查询期间,没有其他查询可以声明它吗?
答案 0 :(得分:3)
对于后来发现此问题的任何人,我都会按照@Swapnil建议的链接中建议的流程进行操作:
在那里列出了一些针对各种语言的实现,但是我使用的是Perl,并且那里没有列出,我似乎找不到其他地方已经存在的perl。因此,如果它在将来帮助任何人,我写了这个perl模块来帮助缩短网址:
感谢@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'