2013-03-07 134 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() 
相關問題