有什么办法来创建像GUID短很短的唯一代码?

问题描述 投票:27回答:5

我想创建一个短GUID。有什么办法来创建像GUID短很短的唯一代码?我想创建一个票跟踪号码。

c# guid
5个回答
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());
    }

13
投票

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


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

4
投票

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

例如,如果你在速度小于每秒1生成它们,你可以只增加一个32位INT(1/4的128位GUID的大小)。这将持续很有点超过68三年按1每秒的速率。

如果你的工作你的使用,它应该是很简单的工作了最小尺寸,你可以逃脱。它还将取决于如果你希望能够在任何地方产生它们,或者如果他们将通过一个单一的服务器或一个软件来生成。


4
投票

尝试Base 36,得到唯一的号码所有你需要做的就是使用自动编号,并将其保存为Base36。但是为了他们是随机的,您将需要别的东西。

我会做的是,哈希或加密的票号票证跟踪代码。喜欢,

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

如果你想跟踪代码是唯一的话,我会用一些密钥进行加密。

© www.soinside.com 2019 - 2024. All rights reserved.