在我的 python/pyramid 应用程序中,我让用户生成存储在 amazon s3 存储桶中的 html 页面。我希望每个页面都有一个单独的路径,例如 www.domain.com/2cxj4kl。我已经想出了如何生成要放入 url 的随机字符串,但我更关心重复。如何根据现有字符串列表检查每个字符串,以便不覆盖任何内容?我可以将每个字符串放入字典或数组中,并在每次创建新字符串时检查不断增长的数组/字典吗?继续增长这样的对象是否存在问题,它会以某种方式永久存在于应用程序内存中吗?我怎样才能做到这一点?
2 回答
在一些存储中存储现有标识符列表并将新标识符与列表进行比较的方法在简单的情况下可以工作,但是,如果您必须存储数十亿个标识符,或者如果您想要生成他们在不止一台机器上。这也使存储列表、检索、比较等变得复杂。更不用说锁定了——如果两个用户决定在同一秒创建一个页面怎么办?
通用唯一标识符 (UUID)发生碰撞的几率非常低——比我们的星球在接下来的五分钟内被黑洞吞噬的几率要低得多。如此之低,以至于您出于任何实际目的都可以忽略它。
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 随机性要小,但发生冲突的可能性仍然比亚马逊数据中心的看门人精神失常、用斧头摧毁你的服务器的可能性要低得多让数据中心着火:)
我是 Python 和编程的新手,但这里有一些我可以通过“随机字符串”的想法看到的问题:
如果您使用较短的字符串,您很可能最终会一遍又一遍地生成相同的字符串。另一方面,如果您使用较长的字符串,则获得相同字符串的变化较小。但是,您需要注意任何一种情况下的重复项。因此,我的建议是对您需要多少个 url 进行一些估计,并为其使用最佳字符串长度。
最简单的方法是将这些 url 保存在一个列表中,并在注册新的之前使用一个简单的 if 检查:
如果 url_list 中有 new_url: generate_new_url() 别的: url_list.append(new_url)
但是,听起来您也希望使用数据库来永久存储您的网址。在大多数基于 sql 的数据库中,您可以将 url 列设置为“唯一”;因此数据库会阻止您使用重复的网址。
我不确定,但使用数据库你可能可以这样做:
尝试: #向数据库中插入值 除了: generate_new_url()