我想创建一个简短的GUID。有没有办法像短GUID一样创建一个简短的唯一代码?我想创建一个票证跟踪号。
发布于 2011-11-14 16:06:14
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());
}
发布于 2011-11-14 15:02:37
Jeff Atwood在他的博客上有一篇文章如何在不丢失信息的情况下将GUID缩短到20个字符:
发布于 2014-12-02 08:28:03
一年内独一无二,明显的“随机性”
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());
}
https://stackoverflow.com/questions/8118252
复制相似问题