2014-07-26 24 views
2

我正在嘗試爲我的網站上的項目生成唯一的短網址。例如,用戶可以添加一個項目,所產生的URL會是這樣的:如何生成短的,獨特的網址

http://example.com/item/abc 

我希望的唯一標識符要由3個或4個字符,其中的字符是字母和數字。我認爲不是隨機生成字符串,然後確保它們是唯一的,並且尚未使用,我可以提前生成它們並將它們存儲在數據庫中。然後,當用戶添加一個項目時,我可以從數據庫中選擇下一個縮短的url字符串,並將其分配給該項目。這是解決這個問題的好方法嗎?有更好的方法嗎?我認爲它會使它更簡單,因爲它們已經生成。但是,我還可以看到潛在的種族問題,其中兩個項目被分配了相同的識別字符串,並且我不確定LOCK TABLES是否是最佳解決方案。

此外,沒有使用LOCK TABLES,可以這樣保證在MySQL沒有競爭條件?

update ids set item_id=1 WHERE id=(SELECT id FROM ids WHERE item_id IS NULL LIMIT 1); 

然後我可以選擇ID爲1的項目ID?在那個查詢期間沒有其他查詢能夠聲明它?

+0

如果您將項目存儲在數據庫中,它們可能具有某種ID,對吧?難道你不能從該ID生成三個或四個字符的字符串,如'1' - >'aaa','2' - >'aab',...? – PoByBolek

+2

看看http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener – Swapnil

+0

@PoByBolek,是的,我可以。我只是希望字符串不太可預測。不一定按順序。 – srchulo

回答

2

對於任何人誰以後發現這個問題,我也跟着過程在鏈路建議@Swapnil建議:

How to code a URL shortener?

有各種語言的上市有一些實現,但我用perl並且未列出那裏,我似乎無法找到AP如果其他地方已經存在的話。所以,如果它可以幫助任何人在未來,我寫了這個Perl模塊,以幫助縮短網址:

Short::URL

感謝@Swapnil指着我正確的地方。

1

只是關於你的短url問題。

您可以使用縮短的表示法對網址進行編碼。

在Python可以哈希網址,後來其編碼爲B64,這將減少長度,並具有獨特的表現爲URL

>>> import base64 
>>> import md5 
>>> url = '/item/abc' 
>>> hash = md5.new(url).digest()[-4:] # get the hash for the url 
>>> hash = _hash.replace('=','').replace('/','_') # some cleaning 
>>> print base64.b64encode(hash) 
'CVKi2Q'