2011-02-17 63 views
3

在我的網站中,我需要創建一個管理員用戶用來將其發送給一組用戶的唯一URL。每當管理員創建新表單時,都會創建唯一的URL。我知道我可以使用guid來表示唯一的URL,但我正在尋找更短的內容(希望大約有4個字符,因爲它更易於記憶)。我怎麼會產生ASP.NET專屬的網址,應該是這樣的:在ASP.NET中創建唯一的URL

http://mydomain.com/ABCD 

我瞭解一些URL縮短服務網站(例如bit.ly)做這樣的事情在很短的唯一的URL。有沒有我可以使用的算法?

+0

是否有任何理由不能在SQL中使用標識列,如果您希望它們的編號始終爲4個字符,您可以在「1000」處開始種子。對此沒有隨意性,但聽起來這不是問題。 – Zachary 2011-02-17 04:44:26

回答

0

只要寫一個算法來選擇一個GUID一定數目的字符(如第4個或8個字符,每一個連字符最多4個或8個字符)。

一定要檢查其針對數據庫以確保它尚未被使用,並且是否重新生成它。作爲一種保障措施,可能會超時(如果它試圖產生10個並且它們全部被使用,放棄),但不太可能使用任何可能的組合。

1

如何像

public static string GetRandomString (int length) 
{ 
string charPool = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; 
StringBuilder sb = new StringBuilder(); 
Random rnd = new Random(); 

while ((length--) > 0) 
sb.Append(charPool[(int)(rnd.NextDouble() * charPool.Length)]); 

return sb.ToString(); 
} 

,並呼籲

GetRandomString(4); 
+0

`rnd.Next(charPool.Length)`對隨機調用會更好。但是這種方法存在問題,因爲它有可能會不止一次地產生相同的隨機字符串,從而導致衝突。 – 2011-02-17 05:04:12

+0

如果長度> 5,在較短的長度之前,會在產生大約46k輸出後產生衝突。 – CodesInChaos 2014-04-15 08:21:43

0

相信bit.ly執行散列,然後編碼的base64的結果。你可以做同樣的事情,雖然它會超過4個字符。一定要添加處理散列衝突的代碼。當第一個散列正在使用時,您可以追加1,2,3等。

另一種方法是在數據庫中創建一個新表。每次你需要一個新的URL時,在這個表格中添加一行。你可以使用PK作爲URL值。這將只使用四個字符爲您提供多達10,000個唯一值。 Base64編碼甚至更多。