有没有办法创建短的GUID短的唯一代码?

时间:2011-11-14 06:56:54

标签: c# guid

我想创建一个简短的GUID。有没有办法创建短的GUID短的唯一代码? 我想创建一个票证跟踪号码。

5 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:13)

杰夫阿特伍德在他的博客上有一篇文章如何将GUID缩短为20个字符而不会丢失信息:
Coding Horror: Equipping our ASCII Armor

答案 2 :(得分:5)

在一年内独一无二,明显随机

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

答案 3 :(得分:4)

真的取决于您的使用情况。

例如,如果以低于每秒1的速度生成它们,则可以增加32位int(128位GUID的1/4)。这将以超过68年的速度持续超过68秒。

如果你计算出你的用法,那么计算你可以逃脱的最小尺寸应该非常简单。它还取决于您是否希望能够在任何地方生成它们,或者它们是否由单个服务器或软件生成。

答案 4 :(得分:4)

尝试Base 36,要获取唯一号码,您只需使用自动号码,并将其另存为Base36。但是为了让它们随机,你需要别的东西。

我要做的是,将票号哈希或加密为票证跟踪代码。像,

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

如果您希望跟踪代码是唯一的,那么我将使用某些密钥加密。