web-dev-qa-db-ja.com

短いGUIDのような短い一意のコードを作成する方法はありますか?

短いGUIDを作成します。短いGUIDのような短い一意のコードを作成する方法はありますか?チケット追跡番号を作成したいのですが。

27
masoud ramezani

GUIDは128ビット(16バイト)なので、短いGUIDを作成する場合は、GUIDのエンコードを変更する必要があります。

たとえば、base64またはASCII85を使用できます。

    /// <summary>
    /// Creates a GUID which is guaranteed not to equal the empty GUID
    /// </summary>
    /// <returns>A 24 character long string</returns>
    public static string CreateGuid()
    {
        Guid guid = Guid.Empty;
        while (Guid.Empty == guid)
        {
            guid = Guid.NewGuid();
        }

        // Uses base64 encoding the guid.(Or  ASCII85 encoded)
        // But not recommend using Hex, as it is less efficient.
        return Convert.ToBase64String(guid.ToByteArray());
    }
18
JKhuang

Jeff Atwoodが彼のブログに、情報を失わずにGUIDを20文字に短縮する方法を紹介しています。
コーディングホラー:装備ASCII鎧

13

1年以内に一意、明らかに「ランダム」

string UniqueID()
{
    var t = DateTime.UtcNow;
    long dgit = t.Millisecond   * 1000000000L +
                t.DayOfYear     * 1000000L +
                t.Hour          * 10000L +
                t.Minute        * 100L +
                t.Second;
    return Convert.ToBase64String(BitConverter.GetBytes(dgit).Take(5).ToArray()).TrimEnd('=');
}

これはカスタマイズ可能な文字セットを持つものです

string UniqueID(string CharList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
    var t = DateTime.UtcNow;
    char[] charArray = CharList.ToCharArray();
    var result = new Stack<char>();

    var length = charArray.Length;

    long dgit = 1000000000000L +
                t.Millisecond   * 1000000000L +
                t.DayOfYear     * 1000000L +
                t.Hour          * 10000L +
                t.Minute        * 100L +
                t.Second;

    while (dgit != 0)
    {
        result.Push(charArray[dgit % length]);
        dgit /= length;
    }
    return new string(result.ToArray());
}
5
K. R.

本当にあなたの使い方に依存します。

たとえば、1秒あたり1未満のペースで生成する場合は、32ビットの整数(128ビットのGUIDのサイズの1/4)をインクリメントできます。それはあなたに毎秒1の割合で68年以上少し続くでしょう。

使用量を計算する場合は、問題のない最小サイズを計算するのは非常に簡単です。また、それらをどこでも生成できるようにするか、単一のサーバーまたはソフトウェアによって生成するかによっても異なります。

4
mike

Base 36 を試して、一意の番号を取得するには、自動番号を使用して、Base36として保存するだけです。ただし、それらをランダムにするためには、別のものが必要になります。

私がやることは、チケット追跡コードとしてチケット番号をハッシュまたは暗号化することです。お気に入り、

  code = Base36(MD5(ticketID+"my secrete"));

追跡コードを一意にしたい場合は、いくつかの鍵で暗号化します。

4
Akash Kava