在我的python / pyramid应用程序中,我让用户生成存储在亚马逊s3存储桶中的html页面。我希望每个页面都有一个单独的路径,如www.domain.com/2cxj4kl。我已经想出如何生成随机字符串以放入网址,但我更关心重复。如何根据现有字符串列表检查每个字符串,以便不会覆盖任何内容?我可以将每个字符串放入字典或数组中,并在每次创建新字符串时检查不断增长的数组/字典吗?继续增长这样一个对象是否存在问题,并且它会以某种方式永久存在于应用程序内存中吗?我怎么能这样做?
答案 0 :(得分:6)
在一些存储中存储现有标识符列表并将新标识符与列表进行比较的方法可以在一个简单的情况下工作,但是,如果您必须存储数十亿个标识符,或者如果您需要,则可能会变得棘手想要在多台机器上生成它们。这也使存储列表,检索,比较等更加复杂。更不用说锁定 - 如果两个用户决定在完全相同的秒内创建页面会怎么样?
普遍唯一标识符(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更随机,但仍然有可能发生碰撞的可能性远远低于亚马逊数据中心的看门人精神错乱,毁坏您的服务器的可能性斧头并将数据中心置于火上:)
答案 1 :(得分:1)
我是Python和编程的新手,但是我在“随机字符串”的想法中可以看到一些问题:
如果使用较短的字符串,最有可能会反复生成相同的字符串。另一方面,如果您使用更长的字符串,获取相同字符串的更改会更少。但是,您需要注意两种情况下的重复项。因此,我的建议是对您需要多少网址进行一些估算,并使用最佳字符串长度。
最简单的方法是将这些网址保留在列表中,并在注册新网址之前使用简单的if检查:
if new_url in url_list: generate_new_url() else: url_list.append(new_url)
然而,听起来您还希望使用数据库来永久存储您的网址。在大多数基于sql的数据库中,您可以将url列设置为“唯一”;因此,数据库阻止您使用dublicate urls。
我不确定但是您可以使用数据库执行此操作:
try: #insert value to database except: generate_new_url()