Мне никогда не нравились целые числа и увеличенные идентификаторы. Это создает проблему, когда вы хотите скопировать данные в разные таблицы (две таблицы с одинаковым идентификатором) или в разные базы данных. Guid является большим представителем строк, и он также сталкивается с проблемой, когда вы включаете идентификаторы в URL-адреса веб-приложений. Поэтому я решил использовать версию Guid с короткой строкой, которая в БД похожа на varchar (16). См. Код ниже (метод WebHash ()):
public static class IdentifyGenerator
{
private static object objLock = new object();
private static char[] sybmols = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z',
};
/// <summary>
/// Creates a new Unique Identity HashCode (length 16 chars)
/// </summary>
/// <returns></returns>
public static string WebHash(Guid fromGuid = default(Guid))
{
lock (objLock)
return RandomString(16, (fromGuid != default(Guid) ? fromGuid.ToByteArray() : null));
}
public static string RandomString(int length, byte[] customBytes = null)
{
Stack<byte> bytes = customBytes != null ? new Stack<byte>(customBytes) : new Stack<byte>();
string output = string.Empty;
for (int i = 0; i < length; i++)
{
if (bytes.Count == 0)
bytes = new Stack<byte>(Guid.NewGuid().ToByteArray());
byte pop = bytes.Pop();
output += sybmols[pop % sybmols.Length];
}
return output;
}
}
Единственный недостаток - когда вы создаете новые строки в SQL. Таким образом, вы должны создать аналогичную функцию sql.
Будем рады получить любого критика в мой адрес.