【问题标题】:how to generate short, unique urls如何生成简短、独特的网址
【发布时间】:2014-07-26 20:44:40
【问题描述】:

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

【问题讨论】:

标签: url short-url


【解决方案1】:

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

How to code a URL shortener?

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

Short::URL

感谢@Swapnil 为我指出正确的地方。

【讨论】:

    【解决方案2】:

    关于您的短网址问题。

    您可以将网址编码为缩短的表示形式。

    在 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2020-08-22
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2018-08-29
      • 2010-10-28
      相关资源
      最近更新 更多