我正在搜索我正在创建的CMS的主键,它不是按升序或降序排列,所以我决定使用随机数。
我想使用随机数作为PK并且因为重复数字的可能性;是否可以给出一个不应该在下一代随机生成的数字数组?
我没有使用任何数据库。
答案 0 :(得分:4)
您可以尝试Guid
:
string guid = Guid.NewGuid().ToString("N");
来自msdn:
GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符具有非常低的重复概率
一个有趣的link反对计数和专业人员。
答案 1 :(得分:0)
我不得不说如果你没有使用数据库我会建议利用文本文件。在文本文件中将是单个值 - 计数器 - 代码看起来像这样:
lock (_lockObj)
{
var cntr = Convert.ToInt32(File.ReadAllText("path to counter file"));
var newKey = cntr;
cntr++
File.WriteAllText("path to counter file", cntr.ToString());
}
其中_lockObj
在类范围内声明为:
private readonly object _lockObj = new Object();
这里需要注意的是,您获得计数器的课程需要为Singleton,因为您不希望拥有多个_lockObj
。
另外请注意,如果您打算在用户之间分享这一点,您将希望通过所有共享的服务(例如Web服务)访问此类,以便在锁定文件时它们都锁定在同一个锁定对象上,从而等待彼此。
答案 2 :(得分:0)
无论您使用的是数据库(我强烈推荐),还是文本文件或其他内容,都存在针对使用过的密钥检查新密钥的问题。这一开始不会成为问题,因为你开始使用的键很少。如果您添加了大量数字,验证新密钥将花费更多时间,因为将有更多的密钥可供比较。
您可以通过每次使用密钥生成所有密钥一次,开始并删除使用过的密钥(或将其标记为已使用)来解决此问题。
无需具体了解详细信息:例如,您可以在表中生成500'000行(或更多行),并包括行号,PK和将行标记为“已使用”的字段。当您需要新密钥时,从随机行中选择PK,并将该行标记为已使用(或删除它,如果您愿意)。
如果你使用文本文件,你也可以这样做,确保在你去的时候删除每个“拾取”的行。