2013-03-07 122 views
3

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

回答

5

在一些存储器中存储的现有标识符的列表,以及比较新的标识符与列表的方法将在一个简单的情况下工作但是,如果您必须存储数十亿个标识符,或者您想在多台计算机上生成这些标识符,则这可能会变得棘手。这也使存储列表,检索,比较等事情变得复杂。更不用说锁定了 - 如果两个用户决定在同一秒创建一个页面,该怎么办?

通用唯一标识符(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

伟大的隐喻。 – 2013-03-08 01:08:54

+0

这是一个很好的答案。 shortuuid对此更好。 – BigBoy1337 2013-03-09 05:17:51

1

我是新来的Python和编程,但这里的几个问题我可以用“随机字符串”的想法看:

你很可能最终遍地产生相同的字符串,如果你正在使用短字符串。另一方面,如果你使用的是更长的字符串,获取相同字符串的变化就会减少。但是,无论在哪种情况下,您都需要注意重复。因此,我的建议是对你需要多少网址进行一些估算,并使用最佳的字符串长度。

最简单的方法是让这些URL列表中,并用一个简单的,如果检查注册新的之前:

if new_url in url_list: 
    generate_new_url() 
else: 
    url_list.append(new_url) 

但是它也听起来像是你将要采用数据库永久保存您的网址。在大多数基于SQL的数据库中,您可以将url列设置为“唯一”;因此数据库阻止你有dublicate网址。

我不知道,但与数据库,你也许可以做到这一点:

try: 
    #insert value to database 
except: 
    generate_new_url() 
相关问题