类似YouTube的GUID(YouTube-like GUID)

2019-07-18 22:53发布

是否有可能产生的YouTube(N7Et6c9nL9w)短GUID是怎样的?

怎么做到呢? 我想在Web应用程序中使用它。

Answer 1:

您可以使用Base64编码:

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

产生像绳子E1HKfn68Pkms5zsZsvKONw== 。 由于GUID始终是128位,则可以省略==你知道永远是存在于结束,并且会给你一个22字符的字符串。 这不是短的YouTube虽然。



Answer 2:

9个字符不是一个GUID。 鉴于这种情况,你可以使用一个int,它给你一个8字符的字符串的十六进制表示。

更新1:不知道为什么上面有一个downvote,但任何人都知道:

您可以使用您可能已经有一个id。 你也可以使用.GetHashCode针对不同的简单类型和你有不同的INT。 您也可以异或的不同领域。 而如果你进去,你甚至可以使用随机数 - 嘿,你有远高于2.000.000.000+可能的值,如果你坚持到阳性;)



Answer 3:

就像在接受的答案提到的,它可以,如果你使用的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);


Answer 4:

正如其他人所说,YouTube的VideoId在技术上不是一个GUID,因为它不是固有的独特。

按照维基百科 :

唯一键的总数为2 128或3.4×10 38。 这个数字是如此之大,产生相同数目的概率随机地两次是可忽略的。

该独特的YouTube的VideoId是由它们生成器算法维护。

你可以写自己的算法,也可以使用某种随机字串发电机和利用UNIQUE CONSTRAINT约束在SQL执行它的独特性。

首先,创建一个UNIQUE CONSTRAINT在数据库中:

ALTER TABLE MyTable
ADD CONSTRAINT UniqueUrlId
UNIQUE (UrlId);

然后,例如,生成一个随机字符串(从philipproplesch的答案 ):

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

如果产生UrlId是足够随机和足够长,你应该很少遇到当SQL遇到重复所引发的异常UrlId 。 在这种情况下,您可以轻松地处理网络应用中的例外。



Answer 5:

技术上讲,它不是一个GUID。 YouTube有一个简单的随机字符串发生器,或许您可以使用允许的字符数组和随机数发生器几分钟掀起。



Answer 6:

这可能是不是最好的解决办法,但你可以做这样的事情:

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


Answer 7:

此ID可能不是全球唯一的。 GUID的应是全局唯一的,因为它们包括其不应当发生在其他地方(生成ID,产生该ID的时间等的机器的MAC地址)的元素

如果你需要的是一个ID,它是你的应用程序中是唯一的,使用一些喷泉 - 也许编码值作为一个十六进制数。 每当你需要一个ID的时间,从数喷泉抓住它。

如果你有多个服务器分配的ID,你可以抓住一个数字范围(取决于你如何快速分配ID的几十个或数千个),而且应该做的工作。 一个8位十六进制数字会给你04十亿IDS - 但你的第一个标识号的将是短了很多。



文章来源: YouTube-like GUID