[英]Is there any way to create a short unique code like short GUID?
我想創建一個簡短的 GUID。 有什么方法可以創建像短 GUID 這樣的短唯一代碼? 我想創建一個機票跟蹤號碼。
GUID 的長度是 128bits(16bytes),所以如果你想創建一個短的 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 個字符:
編碼恐怖:裝備我們的 ASCII 盔甲
一年內獨一無二,明顯“隨機”
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());
}
真的取決於你的使用。
例如,如果您以低於每秒 1 的速度生成它們,您可以只增加 32 位 int(128 位 GUID 大小的 1/4)。 以每秒 1 次的速度,這將持續 68 年多一點。
如果您計算出您的使用情況,那么計算出您可以擺脫的最小尺寸應該非常簡單。 它還取決於您是否希望能夠在任何地方生成它們,或者它們是否將由單個服務器或軟件生成。
嘗試Base 36 ,要獲得唯一編號,您只需使用自動編號,並將其另存為 Base36。 但是,為了使它們是隨機的,您將需要其他東西。
我要做的是,將票號散列或加密為票證跟蹤代碼。 像,
code = Base36(MD5(ticketID+"my secrete"));
如果您希望跟蹤代碼是唯一的,那么我將使用一些密鑰進行加密。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.