【问题标题】:How can I generate a random url of a certain length every time a page is created?每次创建页面时,如何生成一定长度的随机 url?
【发布时间】:2013-02-22 01:11:48
【问题描述】:

在我的 python/pyramid 应用程序中,我让用户生成存储在 amazon s3 存储桶中的 html 页面。我希望每个页面都有一个单独的路径,例如 www.domain.com/2cxj4kl。我已经想出了如何生成要放入 url 的随机字符串,但我更关心重复项。如何根据现有字符串列表检查每个字符串,以便不覆盖任何内容?我可以将每个字符串放入字典或数组中,并在每次创建新字符串时检查不断增长的数组/字典吗?继续增长这样的对象是否存在问题,它会以某种方式永久存在于应用程序内存中吗?我该怎么做?

【问题讨论】:

    标签: python url data-structures pyramid


    【解决方案1】:

    在一些存储中存储现有标识符列表并将新标识符与列表进行比较的方法在简单的情况下可行,但是,如果您必须存储数十亿个标识符,或者如果您想要在不止一台机器上生成它们。这也使存储列表、检索、比较等变得复杂。更不用说锁定了——如果两个用户决定在同一秒创建一个页面怎么办?

    通用唯一标识符 (UUID) 有一个 very-very low chance of collision - 比我们的星球在接下来的五分钟内被黑洞吞噬的几率要低得多。如此之低,以至于您出于任何实际目的都可以忽略它。

    Python 有一个名为 uuid 的库来生成 UUID

    >>> import uuid
    >>> # make a random UUID
    >>> u = uuid.uuid4()
    >>> u.hex
    'f3db6f9a34ed48938a45113ac4b5f156'
    

    生成的字符串长度为 32 个字符,这对您来说可能太长了。

    或者,您可以像这样生成一个随机字符串:

    ''.join(random.choice(string.ascii_letters + string.digits) for x in range(12))
    

    在 10-15 个字符长时,它的随机性可能比 UUID 少,但发生冲突的可能性仍然比亚马逊数据中心的管理员发疯、破坏服务器的可能性要低得多一把斧头,让数据中心着火:)

    【讨论】:

    • 这是一个很好的答案。 shortuuid 甚至更好。
    【解决方案2】:

    我是 Python 和编程新手,但这里有一些我可以通过“随机字符串”的想法看到的问题:

    如果您使用较短的字符串,您很可能最终会一遍又一遍地生成相同的字符串。另一方面,如果您使用较长的字符串,则获得相同字符串的变化较小。但是,您需要注意任何一种情况下的重复项。因此,我的建议是估计您需要多少个 url,并为其使用最佳字符串长度。

    最简单的方法是将这些网址保存在一个列表中,并在注册新网址之前使用简单的 if 检查:

    如果 url_list 中有 new_url:
        generate_new_url()
    别的:
        url_list.append(new_url)
    

    不过,听起来您也需要使用数据库来永久存储您的网址。在大多数基于 sql 的数据库中,您可以将 url 列设置为“唯一”;因此数据库会阻止您使用重复的网址。

    我不确定,但使用数据库您可能可以这样做:

    尝试:
        #向数据库中插入值
    除了:
        generate_new_url()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2012-06-09
      • 2020-03-11
      • 2014-03-16
      相关资源
      最近更新 更多