質問

YouTube (N7Et6c9nL9w) のような短い GUID を生成することはできますか?

どうすればそれができるのでしょうか?Webアプリで使いたいです。

役に立ちましたか?

解決

あなたは、Base64を使用することができます:

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

E1HKfn68Pkms5zsZsvKONw==のような文字列を生成します。 GUIDは常に128ビットであるので、あなたは常に末端に存在することがわかっている==を省略することができ、それはあなたに22文字の文字列を与えます。しかしこれはYouTubeなどのように短いではありません。

他のヒント

9 文字は Guid ではありません。その場合、int の 16 進表現を使用すると、8 文字の文字列が得られます。

アップデート 1: なぜ上記が反対票を集めたのかわかりませんが、疑問に思っている人のために:

すでにお持ちの ID を使用できます。また、さまざまな単純型に対して .GetHashCode を使用することもでき、そこでは異なる int が得られます。異なるフィールドの XOR を実行することもできます。興味がある場合は、乱数を使用することもできます。良い点に固執すると、2,000,000,000 をはるかに超える値が得られます ;)

あなたが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);
他の人が述べたように、

、YouTubeのVideoIdは、それが本質的にユニークではありませんので、技術的にはGUIDではありません。

ウィキペディアするます:

  

ユニークキーの総数は2 128 3.4×10 38 。この数はそうです   大同じ数の確率は、ランダムに生成されること   二回無視できる程度である。

一意YouTubeのVideoIdは、その発電アルゴリズムによって維持されます。

あなたがあなた自身のアルゴリズムを記述するか、またはあなたがその一意性を強制するために、ランダムな文字列発生装置のいくつかの並べ替えを使用してSQLでUNIQUE CONSTRAINT制約を利用することができます。

まず、データベース内のUNIQUE CONSTRAINTを作成します:

ALTER TABLE MyTable
ADD CONSTRAINT UniqueUrlId
UNIQUE (UrlId);

そして、例えば、ランダムな文字列を生成(philippropleschのに答えるhref="https://stackoverflow.com/questions/1458468/guid-like-in-youtube/1458727#1458727"> ):

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

生成UrlIdが十分にランダムであり、十分に長いあなたはめったにSQLが重複UrlIdに遭遇したときにスローされる例外が発生してはならない場合。このようなイベントでは、簡単にあなたのウェブアプリで例外を処理することができます。

技術的には、GUIDではありません。ユーチューブは、おそらく許可される文字の配列と乱数ジェネレータを使用して数分でかき立てることができ、単純な無作為化列生成を持っています。

これは、最善の解決策ではないかもしれませんが、あなたはそのような何かを行うことができます

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

このIDはおそらくグローバルに一意ではありません。彼らは他の場所で発生してはならない要素を含むようにGUIDのグローバルに一意でなければならない(ID、IDが生成された時間、などを生成するマシンのMACアドレス。)

何が必要であれば数噴水を使用して、アプリケーション内で一意のIDです - おそらく進数として値を符号化します。あなたがIDを必要とするたびに、多数の噴水からそれをつかむます。

あなたがIDを割り当て、複数のサーバーを持っている場合は、番号の範囲を(数十あるいは数千人がどのようにすばやく配分しているIDSによって異なります)をつかむことができ、それが仕事をする必要があります。 8桁の16進数は、あなたに40億個のIDを与えるだろう - しかし、あなたの最初のIDがたくさん短くなります。

GUIDではありません

以下に飛び込んでみましょう

それは、 TotalMilliseconds から EPOCH および有効な文字セット。

これはグローバルに一意ではなく、定義されているインスタンスに一意になります。

public string YoutubeLikeId()
{
    Thread.Sleep(1);//make everything unique while looping
    long ticks = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1,0,0,0,0))).TotalMilliseconds;//EPOCH
    char[] baseChars = new char[] { '0','1','2','3','4','5','6','7','8','9',
            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
            'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'};

    int i = 32;
    char[] buffer = new char[i];
    int targetBase= baseChars.Length;

    do
    {
        buffer[--i] = baseChars[ticks % targetBase];
        ticks = ticks / targetBase;
    }
    while (ticks > 0);

    char[] result = new char[32 - i];
    Array.Copy(buffer, i, result, 0, 32 - i);

    return new string(result);
}

出力は次のようになります

XOTgBsu
XOTgBtB
XOTgBtR
XOTgBtg
XOTgBtw
XOTgBuE

アップデート: 同じことは以下からも達成できます Guid として

var guid = Guid.NewGuid(); 
guid.ToString("N");
guid.ToString("N").Substring(0,8);
guid.ToString("N").Substring(8,4);
guid.ToString("N").Substring(12,4);
guid.ToString("N").Substring(16,4);
guid.ToString("N").Substring(20,12);

ガイドの場合 ecd65132-ab5a-4587-87b8-b875e2fe0f35 それを塊に分割します ecd65132 ,ab5a , 4587,87b8,b875e2fe0f35

ただし、常に一意であることは保証できません。

アップデート 2: というプロジェクトもあります ショートガイド フレンドリーな URL を取得するには GUID 通常のものから/に変換できます Guid

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top