我从不喜欢整数和递增的标识符。当您想要跨不同表(两个表相同 ID)或跨不同数据库复制数据时,就会出现问题。Guid 作为一个字符串代表很大,当您在 Web 应用程序 url 中包含 id 时也会出现问题。所以我决定使用一个短字符串版本的 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 函数。
很高兴在我的地址中收到任何批评。