【发布时间】:2014-02-05 06:32:33
【问题描述】:
我正在使用下面的代码来生成如下的随机密钥 TX8L1I
public string GetNewId()
{
string result = string.Empty;
Random rnd = new Random();
short codeLength = 5;
string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuilder builder = new StringBuilder(codeLength);
for (int i = 0; i < codeLength; ++i)
builder.Append(chars[rnd.Next(chars.Length)]);
result = string.Format("{0}{1}", "T", builder.ToString());
return result;
}
每次生成一个键时,都会在数据库上创建一条对应记录,使用生成的结果作为主键。当然,这是不安全的,因为可能会发生主键违规。
解决这个问题的正确方法是什么?我是否应该加载所有现有密钥并根据该列表验证该密钥是否已经存在,如果是,则生成另一个?
或者更有效的方法是将这个逻辑移到数据库端?但即使在数据库端,我仍然需要检查生成的随机键是否在当前表中不存在。
有什么想法吗?
谢谢
【问题讨论】:
-
...
uniqueidentifier... 类型的主键呢? -
密钥长度为6,以T开头有什么要求吗?
-
有 60466176 个可能的代码。在数据库中生成它们并标记每个已使用的(按列或删除已使用的行)。然后你只需要确保“选择一个代码,将其标记为已使用,返回值”是序列化的或避免冲突 - 在大多数数据库中很容易做到。
-
我会通过不使用随机键来完全避免整个问题,但要回答我如何不使用随机键,我需要了解您要解决的问题通过使用它们。
-
@JanneMatikainen 是的,我需要使用我提供的格式生成字符串(例如 TX8L1I)