如何在每次创建页面时生成特定长度的随机网址?
在我的Python/Pyramid应用中,我让用户生成HTML页面,这些页面存储在亚马逊的S3存储桶里。我希望每个页面都有一个独立的路径,比如www.domain.com/2cxj4kl。我已经想出了如何生成随机字符串放在网址里,但我更担心的是重复的问题。我该如何检查这些字符串,确保没有重复的呢?我可以把每个字符串放在一个字典或数组里,每次创建新字符串时检查这个不断增长的字典或数组吗?这样做会不会有什么问题?比如说,这个对象会一直在应用的内存中存在吗?我该怎么做呢?
2 个回答
我刚开始学Python和编程,但我发现关于“随机字符串”的想法有几个问题:
如果你使用的字符串比较短,你很可能会不断生成相同的字符串。相反,如果你使用的字符串比较长,生成相同字符串的机会就会减少。不过,无论哪种情况,你都需要注意重复的字符串。因此,我建议你先估算一下你需要多少个网址,然后选择一个合适的字符串长度。
最简单的方法是把这些网址放在一个列表里,然后在注册新网址之前做个简单的检查:
if new_url in url_list: generate_new_url() else: url_list.append(new_url)
不过,听起来你可能还想用数据库来永久存储你的网址。在大多数基于SQL的数据库中,你可以设置网址这一列为“唯一”,这样数据库就会阻止你有重复的网址。
我不太确定,但在数据库中你可能可以这样做:
try: #insert value to database except: generate_new_url()
把现有的标识符(比如ID)存储在某个地方,然后把新来的标识符和这些存储的标识符进行比较,这种方法在简单的情况下是可行的。但是,如果你需要存储数十亿个标识符,或者想在多台机器上生成标识符,这就会变得复杂了。存储列表、取出列表、比较等等都会变得麻烦。更别提锁定的问题了——如果两个用户在同一秒钟决定创建一个页面,那该怎么办呢?
通用唯一标识符(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那么强,但重复的概率仍然远低于,比如说亚马逊数据中心的清洁工发疯,用斧头砸毁你的服务器并点燃数据中心的概率 :)