我想创建一个短的 GUID。有没有类似短GUID这样的方法来创建短的唯一代码? 我想创建一个票据跟踪号码。
我想创建一个短的 GUID。有没有类似短GUID这样的方法来创建短的唯一代码? 我想创建一个票据跟踪号码。
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());
}
Jeff Atwood在他的博客中有一篇文章,介绍如何将GUID缩短为20个字符而不丢失信息:
Coding Horror: Equipping our ASCII Armor
在一年内唯一,外观“随机”
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());
}
code = Base36(MD5(ticketID+"my secrete"));
这取决于您的使用情况。
例如,如果您的生成速度小于每秒1个,可以递增一个32位整数(比128位GUID小四分之一)。这样的话,在每秒生成一个的速率下,它将持续超过68年。
如果您计算出您的使用情况,就可以很容易地确定最小的大小。此外,这也取决于您是否想在任何地方生成它们,还是它们将由单个服务器或软件生成。
还有一种替代库可以将Guid转换为较短的26个字符的文本表示。它不是使用Base64编码,而是使用Base32字典,这是URL安全且不区分大小写的。
var guid = Guid.NewGuid(); // b392ebf5-88d3-49b9-9ad8-1d4a73431787
var shorterGuid = guid.ToShorterString(); // yrpt5gynl2wonaqs3p5baksrkw