Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成简短、唯一的URL_Url_Short Url - Fatal编程技术网

如何生成简短、唯一的URL

如何生成简短、唯一的URL,url,short-url,Url,Short Url,我正在尝试为我的站点上的项目生成唯一、简短的URL。例如,用户可能会添加一个项目,结果url如下: http://example.com/item/abc 我希望唯一标识符由3或4个字符组成,其中字符是字母和数字。我想,与其随机生成字符串,然后确保它们是唯一的,而且还没有被使用,不如提前生成它们并将它们存储在数据库中。然后,当用户添加一个项目时,我可以从数据库中选择下一个缩短的url字符串并将其分配给该项目。这是解决这个问题的好办法吗?有更好的方法吗?我认为这会使它更简单,因为它们已经生成了。

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

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

另外,如果不使用
锁表
,这样的东西能保证MySQL中没有竞争条件吗

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

然后我可以为id为1的项目选择id?在这个查询过程中,没有其他查询能够声明它吗?

关于您的简短URL问题

您可以将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'

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

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


感谢@Swapnil为我指出了正确的位置。

如果您将项目存储在数据库中,它们可能有某种id,对吗?您不能从该id生成一个三或四个字符的字符串,例如,
1
->
aaa
2
->
aab
?看看@PoByBolek,是的,我可以。我只是希望字符串不那么可预测。不一定是按顺序的。像这样的东西可能符合要求:@Swapnil,谢谢!这是一个很好的资源。