簡體   English   中英

有什么方法可以創建像短 GUID 這樣的短唯一代碼?

[英]Is there any way to create a short unique code like short GUID?

我想創建一個簡短的 GUID。 有什么方法可以創建像短 GUID 這樣的短唯一代碼? 我想創建一個機票跟蹤號碼。

GUID 的長度是 128bits(16bytes),所以如果你想創建一個短的 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());
    }

Jeff Atwood 在他的博客上有一篇文章如何在不丟失信息的情況下將 GUID 縮短為 20 個字符:
編碼恐怖:裝備我們的 ASCII 盔甲

一年內獨一無二,明顯“隨機”

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());
}

真的取決於你的使用。

例如,如果您以低於每秒 1 的速度生成它們,您可以只增加 32 位 int(128 位 GUID 大小的 1/4)。 以每秒 1 次的速度,這將持續 68 年多一點。

如果您計算出您的使用情況,那么計算出您可以擺脫的最小尺寸應該非常簡單。 它還取決於您是否希望能夠在任何地方生成它們,或者它們是否將由單個服務器或軟件生成。

嘗試Base 36 ,要獲得唯一編號,您只需使用自動編號,並將其另存為 Base36。 但是,為了使它們是隨機的,您將需要其他東西。

我要做的是,將票號散列或加密為票證跟蹤代碼。 像,

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

如果您希望跟蹤代碼是唯一的,那么我將使用一些密鑰進行加密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM