随机数生成,除了一些给定的数字

本文关键字:数字 随机数 | 更新日期: 2023-09-27 18:11:54

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

我想使用随机数作为PK,因为重复数字的可能性;是否有可能给出一个不应该在下一个随机生成的数字数组?

我没有使用任何数据库

随机数生成,除了一些给定的数字

你可以试试Guid:

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

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

一个有趣的链接,反对计数和支持。

我不得不说,如果您不使用数据库,我建议您利用文本文件。在文本文件中应该是一个值——计数器——代码看起来像这样:

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服务)来访问,这样当你锁定文件时,他们都锁定在同一个锁定对象上,因此等待对方

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

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

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

如果您使用的是文本文件,您也可以这样做,确保删除每一行"选定"的行。