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