2009-09-22 45 views
39

是否有可能像YouTube一樣生成短GUID(N7Et6c9nL9w)?類似YouTube的GUID

怎麼辦?我想在網絡應用程序中使用它。

回答

38

您可以使用Base64編碼:

string base64Guid = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 

這產生像E1HKfn68Pkms5zsZsvKONw==的字符串。由於GUID始終爲128位,所以可以省略==,您知道它總是出現在最後,並且會給出22個字符的字符串。儘管這不像YouTube那麼簡短。

+21

該方法具有,將所生成的值可以包含在斜線(/)符號,其可以,當unproperly處理,是不方便的缺點在Url的 – 2011-05-25 21:10:34

+2

雖然我很喜歡這個解決方案,但我同意Jhonny D.不僅可以出現'/',還可以'+'這將完全破壞你的網址。 *嘆息* – c0d3p03t 2015-03-13 21:40:50

+2

只需使用URL安全字符替換'/'和'+',如' - '和'_'。然後,當再次閱讀導引頭時,在解碼之前將其替換回來。 – 2016-05-13 15:38:07

3

技術上它不是Guid。 Youtube有一個簡單的隨機字符串生成器,您可以使用允許的字符和隨機數生成器的數組在幾分鐘內啓動。

1

此ID可能不是全球唯一的。 GUID應該是全球唯一的,因爲它們包括不應在別處發生的元素(產生ID的機器的MAC地址,ID生成的時間等)。

如果您需要的是一個唯一的ID您的應用程序使用數字噴泉 - 可能將該值編碼爲十六進制數字。每當你需要一個身份證,從數字噴泉抓住它。

如果您有多個服務器分配ID,您可以獲取一系列數字(數十或數千個,取決於您分配ID的速度),並且應該完成這項工作。一個8位數的十六進制數字會給你40億個ID - 但你的第一個ID將會縮短很多。

10

9個字符不是Guid。鑑於此,您可以使用int的十六進制表示形式,它將爲您提供8個char字符串。

更新1:說不上爲什麼上面有一個downvote,但任何人都知道:

您可以使用您可能已經有一個id。你也可以使用.GetHashCode對不同的簡單類型,並且你有一個不同的int。你也可以異或不同的領域。如果你願意,你甚至可以使用一個隨機數字 - 嘿,如果你堅持正數,你的可能值遠高於2.000.000.000+以上;)

+0

我也想知道...在任何情況下,我只是發佈了一個更新給出了給出額外的理由做相反 - upvote :) – eglasius 2009-09-22 09:04:25

3

這可能不是最好的解決方案,但你可以做這樣的事情:

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 
+0

這種方法的唯一問題是,第二個參數實際上是非最小數量的非 - 字母和非數字字符。當我嘗試使用'0'時,我得到了幾個這樣的符號...... – Azimuth 2017-03-31 14:08:44

4

正如其他人所說,YouTube的VideoId從技術上來說不是GUID,因爲它不是固有的獨特。

作爲每Wikipedia

唯一鍵的總數爲2 或3.4×10 38 。這個數字大於 ,那麼相同數字隨機產生兩次的概率可以忽略不計。

唯一性YouTube的VideoId由其生成器算法維護。

您可以編寫自己的算法,也可以使用某種隨機字符串生成器,並利用SQL中的UNIQUE CONSTRAINT約束來強制其唯一性。

首先,在數據庫中創建一個UNIQUE CONSTRAINT

ALTER TABLE MyTable 
ADD CONSTRAINT UniqueUrlId 
UNIQUE (UrlId); 

然後,例如,生成一個隨機字符串(從philipproplesch的answer):

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 

如果產生UrlId足夠隨機的,足夠長的時間,當SQL遇到重複的UrlId時,您應該很少遇到引發的異常。在這種情況下,您可以輕鬆處理您的網絡應用程序中的異常情況。

+0

「GeneratePassword」方法唯一的問題是第二個參數實際上是最小數量的非字母和非數字字符。當我嘗試用'0'時,我得到了幾個這樣的符號... – Azimuth 2017-03-31 14:09:10

5

就像在接受的答案中提到的那樣,如果您在URL中使用GUID,則會出現問題。下面是一個更完整的答案:

public string ToShortString(Guid guid) 
    { 
     var base64Guid = Convert.ToBase64String(guid.ToByteArray()); 

     // Replace URL unfriendly characters with better ones 
     base64Guid = base64Guid.Replace('+', '-').Replace('/', '_'); 

     // Remove the trailing == 
     return base64Guid.Substring(0, base64Guid.Length - 2); 
    } 

    public Guid FromShortString(string str) 
    { 
     str = str.Replace('_', '/').Replace('-', '+'); 
     var byteArray = Convert.FromBase64String(str + "=="); 
     return new Guid(byteArray); 
    } 

用法:

 var guid = Guid.NewGuid(); 
     var shortStr = ToShortString(guid); 
     // shortStr will look something like 2LP8GcHr-EC4D__QTizUWw 
     var guid2 = FromShortString(shortStr); 
     Assert.AreEqual(guid, guid2);