我想创建一个简短的GUID。有没有办法创建短的GUID短的唯一代码? 我想创建一个票证跟踪号码。
答案 0 :(得分: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());
}
答案 1 :(得分:13)
杰夫阿特伍德在他的博客上有一篇文章如何将GUID缩短为20个字符而不会丢失信息:
Coding Horror: Equipping our ASCII Armor
答案 2 :(得分: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());
}
答案 3 :(得分:4)
真的取决于您的使用情况。
例如,如果以低于每秒1的速度生成它们,则可以增加32位int(128位GUID的1/4)。这将以超过68年的速度持续超过68秒。
如果你计算出你的用法,那么计算你可以逃脱的最小尺寸应该非常简单。它还取决于您是否希望能够在任何地方生成它们,或者它们是否由单个服务器或软件生成。
答案 4 :(得分:4)
尝试Base 36,要获取唯一号码,您只需使用自动号码,并将其另存为Base36。但是为了让它们随机,你需要别的东西。
我要做的是,将票号哈希或加密为票证跟踪代码。像,
code = Base36(MD5(ticketID+"my secrete"));
如果您希望跟踪代码是唯一的,那么我将使用某些密钥加密。