C# 有没有办法创建一个短的唯一代码,比如短GUID?

C# 有没有办法创建一个短的唯一代码,比如短GUID?,c#,guid,C#,Guid,我想创建一个短GUID。有没有办法创建一个短的唯一代码,比如短GUID? 我想创建一个票证跟踪号。Jeff Atwood在他的博客上有一篇文章,介绍了如何在不丢失信息的情况下将GUID缩短为20个字符: 这取决于你的使用情况 例如,如果以小于每秒1的速度生成它们,则可以只增加32位int(128位GUID大小的1/4)。以每秒1次的速度,这将持续你68年多一点 如果你计算出你的使用量,那么计算出你能逃脱的最小尺寸应该是非常简单的。它还将取决于您是否希望在任何地方生成它们,或者它们是否由单个服务器

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

Jeff Atwood在他的博客上有一篇文章,介绍了如何在不丢失信息的情况下将GUID缩短为20个字符:

这取决于你的使用情况

例如,如果以小于每秒1的速度生成它们,则可以只增加32位int(128位GUID大小的1/4)。以每秒1次的速度,这将持续你68年多一点

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

尝试获取唯一编号您所要做的就是使用自动编号,并将其保存为Base36。然而,为了使它们是随机的,你需要一些别的东西

我要做的是,散列或加密车票号码作为车票跟踪代码。像

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

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

GUID的长度为128位(16字节),因此如果您希望创建一个短GUID,则必须更改GUID的编码

例如,您可以使用base64或asci85

    /// <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());
    }
//
///创建保证不等于空GUID的GUID
/// 
///24个字符长的字符串
公共静态字符串CreateGuid()
{
Guid=Guid.Empty;
while(Guid.Empty==Guid)
{
guid=guid.NewGuid();
}
//使用base64编码guid。(或ASCII85编码)
//但不建议使用十六进制,因为它效率较低。
返回Convert.ToBase64String(guid.ToByteArray());
}

一年内独一无二,明显“随机”

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());
}
string UniqueID(string CharList=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”)
{
var t=DateTime.UtcNow;
char[]charArray=CharList.ToCharArray();
var result=新堆栈();
变量长度=字符长度;
长dgit=10000000000L+
t、 毫秒*100000000升+
t、 年月日*1000000毫升+
t、 小时*10000升+
t、 分钟*100L+
t、 第二;
while(dgit!=0)
{
结果.推送(字符[dgit%长度]);
dgit/=长度;
}
返回新字符串(result.ToArray());
}

它越短,唯一性就越低(请注意,Guid并不是真正的“唯一”)。有多短?它可能来自(比如)数据库标识键吗?GUID不起作用有什么原因吗?@GUID的Lasse部分不能保证是唯一的。@Marc:连续中彩票1000次的几率比生成两个相等的GUID要大!;)@完全正确!有机会!我想说的一点是,尺寸与独特性有关,从技术上讲,即使数量很大,也不能保证绝对独特。因此,理解问题的上下文是关键,因此此处的提示提供了更多信息。这是一个非常好的资源,但如果您从文章中包含足够的信息,以便在从internet上删除这篇文章时生成20个字符的guid,这将非常有帮助。