Я хочу создать короткий GUID. Есть ли способ создать короткий уникальный код, например, короткий GUID? Я хочу создать номер отслеживания билетов.
Есть ли способ создать короткий уникальный код, например, короткий GUID?
Ответ 1
Длина 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());
}
Ответ 2
У Джеффа Этвуда есть статья о его блоге, как сократить GUID до 20 символов без потери информации:
Ужас кодирования: Оснащение наших ASCII-доспехов
Ответ 3
уникальный в течение одного года, видимо "случайный"
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());
}
Ответ 4
Действительно зависит от вашего использования.
Например, если вы генерировали их с шагом менее 1 в секунду, вы могли бы просто увеличить 32-битный int (1/4 размер 128-битного GUID). Это продлится вам немногим более 68 лет со скоростью 1 в секунду.
Если вы используете свое использование, должно быть довольно просто разработать минимальный размер, с которым вы можете избавиться. Это также будет зависеть, если вы хотите иметь возможность генерировать их в любом месте, или если они будут сгенерированы одним сервером или частью программного обеспечения.
Ответ 5
Попробуйте База 36, чтобы получить уникальный номер, все, что вам нужно сделать, это использовать автоматический номер и сохранить его как Base36. Однако для того, чтобы они были случайными, вам нужно что-то еще.
Что я буду делать, это хэш или зашифровать номер билета в качестве кода отслеживания билетов. Как,
code = Base36(MD5(ticketID+"my secrete"));
Если вы хотите, чтобы код отслеживания был уникальным, я зашифрую некоторые ключи.