0

我正在寻找我正在创建的 CMS 的主键,它不是升序或降序,所以我决定使用随机数。

我想使用随机数作为 PK 并且因为重复数字的可能性;是否可以提供一个不应该出现在下一代随机数中的数字数组?

我没有使用任何数据库。

4

3 回答 3

4

你可以试试Guid

string guid = Guid.NewGuid().ToString("N");

来自 msdn:

GUID 是一个 128 位整数(16 个字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低

一个有趣的链接,反对计数和专业指南。

于 2013-05-03T12:43:03.517 回答
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());
}

where在类范围内_lockObj声明如下:

private readonly object _lockObj = new Object();

这里需要注意的是,您从中获取 counter 的类必须是Singleton,因为您不想拥有多个_lockObj.


另一方面,如果您要在用户之间共享它,您将希望通过所有人共享的服务(例如 Web 服务)使此类可访问,以便当您锁定文件时,它们都锁定在同一个锁定对象上并因此彼此等待。

于 2013-05-03T12:47:52.283 回答
0

无论您使用的是数据库(我强烈推荐),还是文本文件或其他东西,都存在检查新密钥与已使用密钥的问题;一开始这不会是问题,因为您一开始使用的钥匙很少。但是,如果您添加很多数字,则验证新密钥将花费更多时间,因为将有更多密钥可供比较。

您可以通过一次生成所有密钥来解决此问题,首先,每次使用密钥时删除已使用的密钥(或将其标记为已使用)。

无需详细说明细节:例如,您可以在表中生成 500'000 行(或更多行),并包括行号、PK 和将行标记为“已使用”的字段。当您需要新密钥时,从随机行中选择 PK,并将该行标记为已使用(或删除它,如果您愿意)。

如果你使用一个文本文件,你也可以这样做,确保在你去的时候删除每个“挑选”的行。

于 2013-05-03T13:19:13.603 回答